0

私はwebviewの次のシナリオを持っています

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_tutorial);
        mWebView = (WebView) findViewById(R.id.webView1);

        mWebView.setWebViewClient(mWebViewClient);

        mWebView.setInitialScale(0);
        mWebView.setVerticalScrollBarEnabled(false);
        mWebView.requestFocusFromTouch();

        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);

        Button btnGo = (Button) findViewById(R.id.button1);
        btnGo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String url = "http://www.google.com";// here goes my server url with https://...... for authentication
                showProgressDialog("Loading");
                mWebView.loadUrl(url);
            }
        });


}    
private void showProgressDialog(String title) {

        if(mProgress == null || !mProgress.isShowing()){
            mProgress = ProgressDialog.show(this, title, "Please wait...", true,
                    true, new OnCancelListener() {
                public void onCancel(DialogInterface pd) {
                    finishActivity();
                }
            });
            mProgress.setCanceledOnTouchOutside(false);
            mProgress.setCancelable(true);  
        }       
    }
private void finishActivity() {
    if(mWebView!=null){
        finish();   
    }

}
private final WebViewClient mWebViewClient = new WebViewClient() {



        public void onPageStarted(WebView view, String url,
                android.graphics.Bitmap favicon) {

            super.onPageStarted(view, url, favicon);
            Log.d("test", "page started");

        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.d("test", "page should override called");
                return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {

            if (mIsLoadingSigninPage) {
                    mIsLoadingSigninPage = false;
                dismissProgressDialog();
            }
            Log.d("test", "page finished");
            super.onPageFinished(view, url);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {

            mIsLoadingSigninPage = false;
            dismissProgressDialog();
            Log.d("test", "page error received");


            super.onReceivedError(view, errorCode, description, failingUrl);
            finishActivity();
        }
};
private void dismissProgressDialog() {
    if (mProgress != null && mProgress.isShowing()) {
        mProgress.dismiss();
        mProgress =null;
    }
}

// これは、以下のポイント 3 の log cat です

 03-07 07:31:20.977: D/test(1431): page started
03-07 07:31:22.788: D/test(1431): page should override called
03-07 07:31:22.887: D/test(1431): page started
03-07 07:31:24.496: D/test(1431): page finished

Ok、

  1. ネットワークが利用できない場合、このコードを実行すると、webviewclient の onReceivedError が呼び出され、
  2. ネットワークが利用可能でページの読み込みが開始され、ネットワークが切断された場合、 onReceivedError も呼び出されます。
  3. ただし、いくつかのインスタンスがあります(ボタンを押した後、1、2、3をカウントし、エミュレーターでf8を使用してネットワークを切断します)mWebView.loadUrl(url)が呼び出され、webViewclientのメソッドが次のように呼び出されます

WebView は空白の白い画面を表示し、onReceivedError は呼び出されません。ここにlogcatがあります

  1. このコードの何が問題なのですか。
  2. onReceivedError が呼び出されない理由。呼び出されない場合、この状況を処理する方法
  3. webView がロードされていないことを確認し、アクティビティを終了する方法
4

1 に答える 1

0

onReceivedError が呼び出されるため、ページ開始とページ終了が確実に呼び出されます:-

-任意のリンクをクリックすると (インターネットが存在しない場合)、URL をオーバーライドする必要があります。エラーがスローされ、それが処理さ
れます。

onRecievedError によって処理されないすべての例外について、http ステータスを確認する必要があります

于 2013-03-07T11:44:06.727 に答える