【发布时间】: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