Pertanyaan Mencegah WebView menampilkan "halaman web tidak tersedia"


Saya memiliki aplikasi yang menggunakan WebView secara ekstensif. Ketika pengguna aplikasi ini tidak memiliki koneksi Internet, halaman yang mengatakan "halaman web tidak tersedia" dan berbagai teks lainnya muncul. Apakah ada cara untuk tidak menampilkan teks generik ini di WebView saya? Saya ingin memberikan penanganan kesalahan saya sendiri.

private final Activity activity = this;

private class MyWebViewClient extends WebViewClient
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
  // I need to do something like this:
  activity.webView.wipeOutThePage();
  activity.myCustomErrorHandling();
  Toast.makeText(activity, description, Toast.LENGTH_LONG).show();
 }
}

saya menemukan WebView-> clearView tidak benar-benar membersihkan pandangan.


75
2017-07-01 18:58


asal


Jawaban:


Pertama buat halaman kesalahan Anda sendiri di HTML dan letakkan di folder aset Anda, sebut saja myerrorpage.html Kemudian dengan onReceivedError:

mWebView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        mWebView.loadUrl("file:///android_asset/myerrorpage.html");

    }
});

88
2017-09-23 00:12



Solusi terbaik yang saya temukan adalah memuat halaman kosong di event OnReceivedError seperti ini:

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

    view.loadUrl("about:blank");
}

23
2017-07-16 13:23



Akhirnya, saya memecahkan masalah ini. (Berhasil sampai sekarang ..)

Solusiku seperti ini ...

  1. Siapkan tata letak untuk menunjukkan kapan kesalahan terjadi, bukan Halaman Web (pesan 'halaman tidak ditemukan' yang kotor) Tata letak memiliki satu tombol, "RELOAD" dengan beberapa pesan panduan.

  2. Jika kesalahan terjadi, Ingat menggunakan boolean dan tunjukkan tata letak yang kami siapkan.

  3. Jika pengguna mengklik tombol "RELOAD", atur mbErrorOccured ke false. Dan Atur mbReloadTekan ke true.
  4. jika mbErrorOccured salah dan mbReloadPressed benar, itu berarti halaman webview berhasil dimuat. 'Penyebab jika kesalahan terjadi lagi, mbErrorOccured akan ditetapkan true pada onReceivedError (...)

Ini sumber lengkap saya. Lihat ini.

public class MyWebViewActivity extends ActionBarActivity implements OnClickListener {

    private final String TAG = MyWebViewActivity.class.getSimpleName();
    private WebView mWebView = null;
    private final String URL = "http://www.google.com";
    private LinearLayout mlLayoutRequestError = null;
    private Handler mhErrorLayoutHide = null;

    private boolean mbErrorOccured = false;
    private boolean mbReloadPressed = false;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);

        ((Button) findViewById(R.id.btnRetry)).setOnClickListener(this);
        mlLayoutRequestError = (LinearLayout) findViewById(R.id.lLayoutRequestError);
        mhErrorLayoutHide = getErrorLayoutHideHandler();

        mWebView = (WebView) findViewById(R.id.webviewMain);
        mWebView.setWebViewClient(new MyWebViewClient());
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        mWebView.setWebChromeClient(getChromeClient());
        mWebView.loadUrl(URL);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return super.onSupportNavigateUp();
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();

        if (id == R.id.btnRetry) {
            if (!mbErrorOccured) {
                return;
            }

            mbReloadPressed = true;
            mWebView.reload();
            mbErrorOccured = false;
        }
    }

    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
            return;
        }
        else {
            finish();
        }

        super.onBackPressed();
    }

    class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (mbErrorOccured == false && mbReloadPressed) {
                hideErrorLayout();
                mbReloadPressed = false;
            }

            super.onPageFinished(view, url);
        }

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

    private WebChromeClient getChromeClient() {
        final ProgressDialog progressDialog = new ProgressDialog(MyWebViewActivity.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);

        return new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }
        };
    }

    private void showErrorLayout() {
        mlLayoutRequestError.setVisibility(View.VISIBLE);
    }

    private void hideErrorLayout() {
        mhErrorLayoutHide.sendEmptyMessageDelayed(10000, 200);
    }

    private Handler getErrorLayoutHideHandler() {
        return new Handler() {
            @Override
            public void handleMessage(Message msg) {
                mlLayoutRequestError.setVisibility(View.GONE);
                super.handleMessage(msg);
            }
        };
    }
}

Tambahan: Berikut adalah tata letak ....

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rLayoutWithWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<WebView
    android:id="@+id/webviewMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<LinearLayout
    android:id="@+id/lLayoutRequestError"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical"
    android:visibility="gone" >

    <Button
        android:id="@+id/btnRetry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minWidth="120dp"
        android:text="RELOAD"
        android:textSize="20dp"
        android:textStyle="bold" />
</LinearLayout>


9
2018-04-08 05:39



Lihat diskusi di Android WebView onReceivedError (). Ini cukup panjang, tetapi konsensus tampaknya bahwa a) Anda tidak dapat menghentikan halaman "halaman web tidak tersedia" muncul, tetapi b) Anda selalu bisa memuat halaman kosong setelah Anda mendapatkan onReceivedError


6
2017-07-01 19:17



Saat tampilan web disematkan di beberapa tampilan khusus sehingga pengguna hampir yakin bahwa ia melihat tampilan asli dan bukan tampilan web. Dalam skenario seperti itu yang menunjukkan kesalahan "halaman tidak dapat dimuat" adalah tidak masuk akal, yang biasanya saya lakukan dalam situasi seperti itu adalah saya memuat halaman kosong dan menampilkan pesan bersulang seperti di bawah ini

webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                Log.e(TAG," Error occured while loading the web page at Url"+ failingUrl+"." +description);     
                view.loadUrl("about:blank");
                Toast.makeText(App.getContext(), "Error occured, please check newtwork connectivity", Toast.LENGTH_SHORT).show();
                super.onReceivedError(view, errorCode, description, failingUrl);
            }
        });

4
2017-11-28 07:52



Anda bisa menggunakan GET meminta untuk mendapatkan konten halaman dan kemudian menampilkan data menggunakan Webview , dengan cara ini Anda tidak menggunakan banyak panggilan server. Alternatif yang bisa Anda gunakan Javascript untuk memeriksa DOM objek untuk validitas.


2
2017-07-11 18:49



Mungkin saya salah memahami pertanyaan, tetapi sepertinya Anda mengatakan bahwa Anda mendapatkan kesalahan menerima panggilan balik, dan Anda hanya bertanya apa cara terbaik untuk tidak menampilkan kesalahan? Mengapa Anda tidak menghapus tampilan web dari layar dan / atau menampilkan tampilan lain di atasnya?


2
2017-07-12 11:55



Saya kira jika Anda bersikeras melakukan ini, Anda bisa memeriksa apakah sumber daya ada di sana sebelum memanggil fungsi loadURL. Cukup dengan mengesampingkan fungsi dan melakukan pemeriksaan sebelum memanggil super ()

REMARK (mungkin di luar topik): Di http, ada metode yang disebut HEAD yang dijelaskan sebagai berikut:

Metode HEAD identik dengan GET, kecuali bahwa server MUST NOT return a message-body dalam respons

Metode ini mungkin berguna. Bagaimana pun Anda menerapkannya ... periksa kode ini:

import java.util.Map;

import android.content.Context;
import android.webkit.WebView;

public class WebViewPreLoad extends WebView{

public WebViewPreLoad(Context context) {
super(context);
}
public void loadUrl(String str){
if(//Check if exists)
super.loadUrl(str);
else
//handle error
}
public void loadUrl(String url, Map<String,String> extraHeaders){
if(//Check if exists)
super.loadUrl(url, extraHeaders);
else
//handle error
}
}

Anda dapat mencoba menggunakan cek ini

if(url.openConnection().getContentLength() > 0)

1
2017-07-08 10:30



Di sini saya menemukan solusi termudah. Lihat ini..

   @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String failingUrl) {
//                view.loadUrl("about:blank");
            mWebView.stopLoading();
            if (!mUtils.isInterentConnection()) {
                Toast.makeText(ReportingActivity.this, "Please Check Internet Connection!", Toast.LENGTH_SHORT).show();
            }
            super.onReceivedError(view, errorCode, description, failingUrl);
        }

Dan di sini adalah metodeInterentConnection () ...

public boolean isInterentConnection() {
    ConnectivityManager manager = (ConnectivityManager) mContext
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager != null) {
        NetworkInfo info[] = manager.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;
}

1
2017-07-11 07:28



Saya hanya akan mengubah halaman web ke apa pun yang Anda gunakan untuk penanganan kesalahan:

getWindow().requestFeature(Window.FEATURE_PROGRESS);  
webview.getSettings().setJavaScriptEnabled(true);  
final Activity activity = this;  
webview.setWebChromeClient(new WebChromeClient() {  
public void onProgressChanged(WebView view, int progress) {  
 // Activities and WebViews measure progress with different scales.  
 // The progress meter will automatically disappear when we reach 100%  
 activity.setProgress(progress * 1000);  
 }  
});  
webview.setWebViewClient(new WebViewClient() {  
public void onReceivedError(WebView view, int errorCode, String description, String 
failingUrl) {  
 Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();  
}  
});  
webview.loadUrl("http://slashdot.org/");

ini semua dapat ditemukan http://developer.android.com/reference/android/webkit/WebView.html


0
2017-07-12 15:37