【问题标题】:Correct way to check internet connection with AsyncTask and output WebView content?使用 AsyncTask 检查 Internet 连接并输出 WebView 内容的正确方法?
【发布时间】:2017-08-16 15:13:04
【问题描述】:

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

MainActivity:

@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

HostAvailabilityTask:

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

如您所见,我只是在MainActivity 中调用isOnline(); 方法,并认为这是使用AsyncTask 的错误方法?我只是想确保以“正确的方式”去做。我也不知道在这种情况下返回onPostExecute 会合乎逻辑吗?

如前所述,我从未使用过AsyncTask,所以我希望有人可以帮助我。我还在我的代码中注释了一些行,以澄清我的困惑。

【问题讨论】:

  • 您不能直接拨打isOnline。您必须改用execute 方法。这是一个如何使用它的示例stackoverflow.com/questions/9671546/asynctask-android-example
  • @SpiderPig 谢谢,我已经访问过这个问题了。我只是想知道这是否适用于我的具体情况以及我是否做得对。因为还有其他问题没有使用 AsyncTask 加载 webview,但我不知道这是否与我的问题有关,因为我只是检查互联网连接:stackoverflow.com/questions/14122089/…
  • 在你的情况下,你的 asynctask 没有对 webview 做任何事情,所以你提到的其他问题在这里不相关。但是你为什么还要在不同的线程中运行它呢?此外,我不确定 ping 是否是执行此检查的最佳方式。你也可以试试这个stackoverflow.com/questions/4238921/…
  • 但话说回来,总是尝试加载您的网站会更有意义,如果失败,您使用本地文件。
  • 我在这里浏览了很多问题,还阅读了有关检查网络可用性的信息,但是可以在没有连接到互联网的情况下建立 WiFi 连接。所以我使用了其他答案的代码。而且我尝试实现 AsyncTask,因为在某些答案中也提出了建议,但是作为 Java 菜鸟很难知道最佳实践。

标签: java android webview android-asynctask


【解决方案1】:
 @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();
    }

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多