【问题标题】:How to get back refreshed web view after onReceivedError如何在 onReceivedError 后恢复刷新的 Web 视图
【发布时间】:2014-09-17 06:33:37
【问题描述】:

我正在开发我正在调用网页的小应用程序。

我想在同一个视图中打开网页时覆盖了 WebViewClient。

我的问题是如果出现任何问题(互联网连接中断或服务器断开连接),那么我将显示自定义错误页面。

但是当 Internet 连接时,它显示相同的错误页面,而不是刷新网页。

这是我的代码: Web查看问题web; 字符串问题网址;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DetectConnection detectConnection = new DetectConnection(getApplicationContext());
    ActionBar bar = getActionBar();

    // for color
    bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#5b5959")));
    questionweb = (WebView) findViewById(R.id.webView1);
    if (!DetectConnection.checkInternetConnection(this)) {
        Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show();
        AlertDialog alertDialog = new AlertDialog.Builder(
                MainActivity.this).create();

        // Setting Dialog Title
        alertDialog.setTitle("Internet Connection");

        // Setting Dialog Message
        alertDialog.setMessage("Please Check Internet Connection");

        // Setting OK Button
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Write your code here to execute after dialog closed
                Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                MainActivity.this.startActivity(intent);
            }
        });

        // Showing Alert Message
        alertDialog.show();

    } else {

    questionweb.getSettings().setJavaScriptEnabled(true);

    // loads the WebView completely zoomed out
    questionweb.getSettings().setLoadWithOverviewMode(true);


    questionweb.getSettings().setUseWideViewPort(true);

    // override the web client to open all links in the same webview
    questionweb.setWebViewClient(new MyWebViewClient());
    questionweb.setWebChromeClient(new MyWebChromeClient());


    questionweb.addJavascriptInterface(new JavaScriptInterface(this),
            "Android");

    // load the home page URL
    questionweb.loadUrl("http://10.2.1.119:8081/OnlineExamV2/login/loginpage");

    }
    // I am calling this to refresh the webpage
    questionweb.loadUrl("javascript:window.location.reload( true )" );  

}

private class MyWebViewClient extends WebViewClient {

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
         super.onReceivedError(view, errorCode, description, failingUrl);
         hideErrorPage(view);
    }

    private void hideErrorPage(WebView view) {

        String customErrorPageHtml = "<html><body><table width=\"100%\" height=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"
                + "<tr>"
                + "<td><div align=\"center\"><font color=\"red\" size=\"22pt\">Sorry! Something went wrong</font></div></td>"
                + "</tr>" + "</table><html><body>";
        view.loadData(customErrorPageHtml, "text/html", null);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         questionweb.loadUrl(url);
        //questionweb.loadUrl("http://10.2.1.119:8081/OnlineExamV2/login/loginpage");

        questionweb.clearHistory();
        return true;
    }



}

private class MyWebChromeClient extends WebChromeClient {

    // display alert message in Web View
    @Override
    public boolean onJsAlert(WebView view, String url, String message,
            JsResult result) {
        Log.d("Web", message);
        new AlertDialog.Builder(view.getContext()).setMessage(message)
                .setCancelable(true).show();
        result.confirm();
        return true;
    }



}

互联网恢复后如何刷新网页。

【问题讨论】:

    标签: android webview refresh


    【解决方案1】:

    也许你可以试试自己的 BroadcastReceiver 类。

    像这样尝试(完全未经测试):

    1.) GlobalState 类:

    public GlobalState {
    
        public static boolean isOnline = true;
        public static String lastUrl = ""; 
    }
    

    2.) 在 onReceivedError 中保存上一个 url 和连接状态:

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    
         super.onReceivedError(view, errorCode, description, failingUrl);
         GlobalState.isOnline = false;
         GlobalState.lastUrl = failingUrl;
    
         hideErrorPage(view);
    }
    

    3.) 在你的活动类中实现一个回调(我不知道名字,所以我称之为 MainActivity.java):

    public class MainActivity extends Activity implements IConnectionCallback {
    
        private ConnectionBroadReceiver cbr = null;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            //some code...
            cbr = new ConnectionBroadReceiver (this);
            registerReceiver(cbr, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
           //some more code...        
        }
    
        //this method will be triggered by ConnectionBroadCastReceiver
        @Override
        public void reload() {
    
            //now reload your webview:
            questionweb.loadUrl(GlobalState.lastUrl);
        }
    }
    

    4.) 定义你的接口回调:

    public interface IConnectionCallback {
    
        public void reload();
    }
    

    5.) 最后但并非最不重要的 ConnectionBroadReceiver 类:

    public class ConnectionBroadReceiver extends BroadcastReceiver {
    
        private IConnectionCallback callback = null;
    
        public ConnectionBroadReceiver (IConnectionCallback callback) {
    
            this.callback = callback;
    
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            ConnectivityManager cm = (ConnectivityManager)    
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
    
            // lets check the connection
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {
    
                //when last state was the offline state (GlobalState.isOnline== false), 
                //lets trigger the callback 
                if (GlobalState.isOnline == false) {
    
                    callback.reload();
                }
                GlobalState.isOnline = true;
             } else {
    
                GlobalState.isOnline = false;
         }
    
    }
    

    【讨论】:

    • 感谢您的详细解释。我用您提供的解决方案解决了我的问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2021-08-21
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多