-1

我需要帮助检查我的应用程序正在运行的手机是否已连接到Internet。我开始ping一个IP来检查连接。它是这样的:如何在Android上正确使用AsyncTask?

protected Boolean checkInternetConnection(Void... params) { 
     try { 
      InetAddress ipAddr = InetAddress.getByName("https://www.google.com"); 

      if (!ipAddr.isReachable(10000)) { 
       return false; 
      } else { 
       return true; 
      } 

     } catch (Exception e) { 
      Log.e("exception", e.toString()); 
      return false; 
     } 
    } 
} 

然而,永诺扔NetworkOnMainThreadException,所以我用的AsyncTask:

private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      InetAddress ipAddr = InetAddress.getByName("https://www.google.com"); 

      if (!ipAddr.isReachable(10000)) { 
       return false; 
      } else { 
       return true; 
      } 

     } catch (Exception e) { 
      Log.e("exception", e.toString()); 
      return false; 
     } 
    } 
} 

这段代码是否正确?因为我不知道怎么称呼它。我试过了:

new CheckConnectionTask().execute(); 

有什么遗漏吗?因为它不起作用。另外请注意,我见过很多以前的问题,但是我没有找到任何对这个问题的答案,所以我问了我自己的问题。如果你已经看到一个可以解决我的问题的答案,你可以在这里链接,但请记住,我对Android或Java没有经验,所以我可能不清楚。我会以正确的代码作为答案,并简要说明我为什么不工作。另外,我需要知道手机是否连接到INTERNET,而不是NETWORK,因此ConnectivityManager不会为我工作。

编辑 - 谢谢大家的回答。首先,我拥有所有需要的权限。此外,我不能得到任何结果目前,由于Android工作室凸显了下面的代码:

Boolean internetConnection; 
internetConnection = new  CheckConnectionTask().execute(); 

由于不正确的,它根本不会让我调用该函数。它有什么问题?它是否缺少任何参数?因为我将参数定义为Void,所以看起来不合逻辑。

编辑2 - 我用onPostExecute,通过@vandaics的建议,现在看起来是这样的:

private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      InetAddress ipAddr = InetAddress.getByName("google.com"); 

      if (!ipAddr.isReachable(10000)) { 
       return false; 
      } else { 
       return true; 
      } 

     } catch (Exception e) { 
      Log.e("exception", e.toString()); 
      return false; 
     } 
    } 
    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     internetConnection = result; 
    } 
} 

它的工作原理,我把它叫做调用onCreate方法时:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new CheckConnectionTask().execute(); 
} 

它的工作原理,我的应用程序检查互联网是否连接并正确反应。如果您认为有些东西可能无法使用,或者有更简单的方法来解决问题,请告诉我。非常感谢你们,尤其是@vandaics和@Sunil。此外,我是否需要像这样使用超类?:

@Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     internetConnection = result; 
    } 

它是做什么的,是否有必要?

+0

您的应用程序是否有权访问Internet?你有清单中的<使用权限android:name =“android.permission.INTERNET”/>“吗? –

+0

你尝试过网络连接吗? –

+0

你怎么知道它什么都没做。那里没有记录表明它是成功还是失败。只有这样,您才会知道它是否执行了任何操作,如果由于例外而失败 – ucsunil

回答

0

检查,如果互联网连接可用,你可以这样做:

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 
    //return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

不能调用

Boolean internetConnection; 
internetConnection = new CheckConnectionTask().execute(); 

excute()返回值是不是你想要的。如果你想使用asyntask您可以在onPostExecute(...)设置一个布尔变量:

private boolean isConnect = false; 
private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> { 
@Override 
protected Boolean doInBackground(Void... params) { 
    try { 
     InetAddress ipAddr = InetAddress.getByName("https://www.google.com"); 

     if (!ipAddr.isReachable(10000)) { 
      return false; 
     } else { 
      return true; 
     } 

    } catch (Exception e) { 
     Log.e("exception", e.toString()); 
     return false; 
    } 
} 
@Override 
protected void onPostExecute(Boolean result) { 
    super.onPostExecute(aVoid); 
    isConnect = result; 
} 
} 

但是,我从来没有使用这种方法来获得互联网连接的状态,东阳我必须一切之前运行此asyntask得到确切身份。

+0

您建议的“isNetworkAvailable”方法检查网络连接还是Internet连接?因为我需要知道是否有INTERNET连接。 – Piotr

+0

它检查网络连接和互联网连接。 – Robust

0

如果你要使用AsyncTaks你错过了onPostExecute方法:

protected void onPostExecute(Boolean result) { 
    //your code here 
} 

您还可以添加可选的onProgressUpdate方法:

protected void onProgressUpdate(Integer... progress) { 
    //do something on update 
} 

然后执行你做:

new DownloadFilesTask()。execute();

这里是一个很好的例子,你可以使用:http://developer.android.com/reference/android/os/AsyncTask.html

+1

问题的结果是一个布尔值,不是很长。此外,“您的代码在这里”有点便宜,似乎原始海报可能不知道该在这里做什么。 –

+0

谢谢@ci_我没注意到。 – BlackHatSamurai

3

您目前没有看到任何东西,因为你还没有登录陈述或者你是不是真的检查什么。

呼叫

新CheckConnectionTask()执行()

运行的AsyncTask。只是没有输出来显示任务。

你可以检查输出,看看它是否是你想要的。

private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      InetAddress ipAddr = InetAddress.getByName("https://www.google.com"); 

      if (!ipAddr.isReachable(10000)) { 
       return false; 
      } else { 
       return true; 
      } 

     } catch (Exception e) { 
      Log.e("exception", e.toString()); 
      return false; 
     } 
    } 

    @Override 
    public void onPostexecute(Boolean result) { 
     // TO DO on the UI thread 
     Log.i("AsyncTask", "Result = " + result"); 
    } 
} 

编辑:呼叫:

新CheckConnectionTask()执行()

返回它正在执行,而不是一个布尔的AsyncTask的实例(虽然。你确实指定布尔应该是输出)。因此,您在这里看到一个编译错误。 AsyncTask被设计为自包含 - 它完成它应该做的一切,然后终止。如果您必须修改一个类级别的实例变量(从包含AsyncTask的类作为内部任务),可以完成但不建议。

+0

谢谢,但我现在无法运行我的代码,因为我想使用它:Boolean internetConnection = new CheckConnectionTask()。execute(); 。这使我的代码无法运行,因为执行后的()包含错误。一个参数应该放在这里,但是我将这个方法的参数定义为Void,那么可能会导致这个问题呢? – Piotr

+0

代码行Boolean internetConnection = new CheckConnectionTask()。execute();是编译错误,我编辑了我的答案来解释原因。如果您有任何问题,请告诉我。 – ucsunil

+0

所以我不应该使用AsyncTask来检查Interet连接?我应该怎么做呢? @vandaics建议的“isNetworkAvailable”方法是否正确? – Piotr

相关问题