Java 使用AsyncTask检查internet连接并输出WebView内容的正确方法?

Java 使用AsyncTask检查internet连接并输出WebView内容的正确方法?,java,android,webview,android-asynctask,Java,Android,Webview,Android Asynctask,我的应用程序基于全屏WebView,如果没有互联网连接,我想显示本地文件,否则请加载我的网站。我以前从未使用过AsyncTask,并尝试了以下操作: main活动: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Check Interne

我的应用程序基于全屏
WebView
,如果没有互联网连接,我想显示本地文件,否则请加载我的网站。我以前从未使用过
AsyncTask
,并尝试了以下操作:

main活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Check Internet Connection
    mWebView = (WebView) findViewById(R.id.activity_main_webview);
    HostAvailabilityTask hostAvailable = new HostAvailabilityTask(this);
    boolean online = hostAvailable.isOnline();

    if (!online) {
        // Loading local html file into web view
        mWebView.loadUrl("file:///android_asset/sample.html");
    } else {
        // load my website here
主机可用性任务

public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {

    private MainActivity main;

    public HostAvailabilityTask(MainActivity main) {
        this.main = main;
    }

    protected Boolean doInBackground(String... params) {
        return isOnline(); // Correct way using AsyncTask?
    }

    protected void onPostExecute(Boolean... result) {
        if(!result[0]) {
            return; // What to return?
        }
    }

    public boolean isOnline() {
        Runtime runtime = Runtime.getRuntime();
        try {
            Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
            int     exitValue = ipProcess.waitFor();
            return (exitValue == 0);
        }
        catch (IOException e)          { e.printStackTrace(); }
        catch (InterruptedException e) { e.printStackTrace(); }

        return false;
    }
}
公共类HostAvailabilityTask扩展了AsyncTask{
私人活动主体;
公共主机可用性任务(主活动主){
this.main=main;
}
受保护的布尔doInBackground(字符串…参数){
返回isOnline();//使用AsyncTask的正确方法?
}
受保护的void onPostExecute(布尔值…结果){
如果(!结果[0]){
return;//返回什么?
}
}
公共布尔isOnline(){
Runtime=Runtime.getRuntime();
试一试{
进程ipProcess=runtime.exec(“/system/bin/ping-c18.8.8”);
int exitValue=ipProcess.waitFor();
返回(exitValue==0);
}
catch(IOE异常){e.printStackTrace();}
catch(InterruptedException e){e.printStackTrace();}
返回false;
}
}
如您所见,我只是调用方法
isOnline()异步任务的错误方法?我只是想确保用“正确的方式”去做。我也不知道在这种情况下,在
onPostExecute
中返回什么是合乎逻辑的


如前所述,我从未使用过
AsyncTask
,因此我希望有人能帮助我。我还对代码中的一些行进行了注释,以澄清我的混淆。

您不能直接调用
isOnline
。您必须改用
execute
方法。下面是一个如何使用它的例子@SpiderPig谢谢,我已经访问了这个问题。我只是想知道这是否适用于我的具体情况,以及我是否做得对。因为还有另外一个问题没有用AsyncTask加载webview,但我不知道这是否与我的问题有关,因为我只是检查internet连接:在您的情况下,AsyncTask没有对webview执行任何操作,因此您提到的其他问题与此处无关。但你为什么还要在另一个线程中运行这个呢?另外,我不确定ping是否是执行此检查的最佳方式。您也可以尝试此方法,但再次尝试加载您的网站会更有意义,如果加载失败,您可以使用本地文件。我在这里浏览了很多问题,我还阅读了有关检查网络可用性的内容,但可以在不连接互联网的情况下使用WiFi连接。所以我用了其他答案的密码。我尝试实现AsyncTask,因为在一些回答中也提出了它,但很难知道作为JavaNoob的最佳实践。
 @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
           //Your code to do
        Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error , Toast.LENGTH_LONG).show();
    }