/ / Jak odzyskać odświeżony widok WWW po onReceivedError - android, webview, refresh

Jak odzyskać odświeżony widok WWW po onReceivedError - Android, webview, odśwież

Pracuję nad małą aplikacją, do której dzwoni strona internetowa.

Nadpisuję WebViewClient, ponieważ chcę otworzyć stronę w tym samym widoku.

Mój problem polega na tym, że jeśli wystąpi jakikolwiek problem (przerwane połączenie z Internetem lub serwer jest rozłączony), wyświetlana jest strona błędów niestandardowych.

Ale kiedy Internet jest podłączony, pokazuje tę samą stronę błędu, a nie odświeżoną stronę internetową.

Oto mój kod: 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;
}



}

Jak uzyskać odświeżoną stronę internetową Po powrocie do Internetu.

Odpowiedzi:

1 dla odpowiedzi № 1

Może możesz dać własną klasę BroadcastReceiver strzałem.

Spróbuj tego (całkowicie nieprzetestowana):

1.) Klasa GlobalState:

public GlobalState {

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

2.) Zapisz swój ostatni adres URL i stan połączenia w 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.) Zaimplementuj wywołanie zwrotne w twojej klasie aktywności (nie znam nazwy, więc nazwałem ją 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.) Określ swoje wywołanie zwrotne interfejsu:

public interface IConnectionCallback {

public void reload();
}

5.) Ostatnia, ale nie najmniejsza klasa 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;
}

}