/ / onReceivedErrorの後にリフレッシュされたWebビューを取得する方法 - android、webview、refresh

onReceivedErrorの後にリフレッシュされたWebビューを取得する方法 - android、webview、refresh

私はウェブページを呼び出す場所に小さなアプリを開発しています。

同じビューでWebページを開きたいのでWebViewClientをオーバーライドします。

私の問題は、問題が発生した場合(インターネット接続が途切れたり、サーバーが切断された場合)、カスタムエラーページが表示されてしまうことです。

しかし、インターネットが接続されているときは、同じエラーページを表示し、リフレッシュされたWebページは表示しません。

ここに私のコードです: WebView questionweb; 文字列クエスチョン;

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



}

インターネットが戻ってきたときにリフレッシュされたウェブページを取得する方法。

回答:

回答№1は1

たぶん自分のBroadcastReceiverクラスにショットを与えることができます。

これを試してみてください(完全にテストされていません):

1.)GlobalStateクラス:

public GlobalState {

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

2)最後のURLと接続状態を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と呼んでいます):

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

}