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