如何在onReceivedError之后恢复刷新的Web视图 [英] How to get back refreshed web view after onReceivedError

查看:60
本文介绍了如何在onReceivedError之后恢复刷新的Web视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发用于调用网页的小型应用程序.

I am developing small app where I am calling webpage.

我想在同一视图中打开网页,所以我覆盖了WebViewClient.

I override WebViewClient as I wants to open webpage in same view.

我的问题是,如果发生任何问题(Internet连接中断或服务器已断开连接),那么我将显示自定义错误页面.

My problem is if there is any problem occur(Internet connection breaks or server is disconnected) then I am showing custom error page.

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

But when Internet is connected it shows same error page, not refreshed web page.

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

Here is my code: WebView questionweb; String questionurl;

@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;
    }



}

如何在刷新互联网后刷新网页.

How to get refreshed web page When internet is back.

推荐答案

也许您可以给自己的BroadcastReceiver类试一下.

Maybe you can give your own BroadcastReceiver class a shot.

尝试一下(完全未经测试):

Try it like this (totally untested):

1.)GlobalState类:

1.) GlobalState class:

public GlobalState {

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

2.)在onReceivedError中保存您的最后一个URL和连接状态:

2.) Save your last url and connection-state in onReceivedError:

@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):

3.) Implement a callback in your activity class (i do not know the name, so i called it 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.)定义您的接口回调:

4.) Define your Interface callback:

public interface IConnectionCallback {

    public void reload();
}

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

5.) Last but not least the ConnectionBroadReceiver class:

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;
     }

}

这篇关于如何在onReceivedError之后恢复刷新的Web视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆