如何在Android中实现AsyncTask的Internet Check?

时间:2013-07-06 13:24:42

标签: android multithreading user-interface android-asynctask return

我正在尝试在AsyncTask中实现Android中的Internet检查。我为此创建了一个单独的类文件。目的是在doInBackground中检查Internet并将值返回到onPostExecute - 并在主UI线程中显示结果。但isNetworkAvailable(context)的上下文参数必须是什么?现在它给出了关于参数的错误。 isNetworkAvailable也可以吗?

如何在onPostExecute中使用此值并将其传递给主UI线程?

import android.content.Context;
import android.net.ConnectivityManager;
import android.os.AsyncTask; 

class InternetCheck extends AsyncTask<Void, Void, Boolean> {


        protected Boolean doInBackground(Void... noargs) {

            return isNetworkAvailable(this);

        }

        protected void onProgressUpdate(Integer... progress) {

         }


        protected void onPostExecute(String result) {

        }

        public static boolean isNetworkAvailable(Context context) 
        {
            return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
        }
}

3 个答案:

答案 0 :(得分:4)

将您的活动/ Fragement作为上下文传递。作为一个非常简单的例子:

class InternetCheck extends AsyncTask<Activity, Void, Boolean> {


        protected Boolean doInBackground(Activity... activitys) {

            return isNetworkAvailable(activitys[0]);

        }

        protected void onProgressUpdate(Integer... progress) {

         }


        protected void onPostExecute(String result) {

        }

        public static boolean isNetworkAvailable(Context context) 
        {
            return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
        }
}

作为旁注:我不确定获取网络信息确实需要花费很多时间在后台进行。

答案 1 :(得分:2)

无需为此执行AsyncTask:

/** This method check internet connection. True for connection enabled, false otherwise. */
public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

对于您使用网络执行的所有操作,请不要忘记权限。

答案 2 :(得分:1)

您需要活动背景

  ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

在您的情况下,this不会引用活动背景。

     protected Boolean doInBackground(Void... noargs) {

        return isNetworkAvailable(this);
    }

我不确定以下发布的代码是否是最佳方式。您可以检查连接是否可用,然后执行某项任务。

public class NetworkHelper {
private static final String TAG=NetworkHelper.class.getSimpleName();

public static boolean isInternetAvailable(Context context)
{
    NetworkInfo info = (NetworkInfo) ((ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

    if (info == null)
    {
         Log.d(TAG,"No Network connection");
         return false;
    }
    else
    {
        if(info.isConnected())
        {
            Log.d(TAG," Network connection available...");
            return true;
        }
        else
        {
            Log.d(TAG,"no Network connection");
            return false;
        }

    }
}
}

在您的活动课程中

  if(NetworkHelper.isInternetAvailable(ActivityName.this))
  {
        // do some task
  }  
  else
  {
        Toast.makeText(ActivityName.this,"No Network connection available",1000).show();
  } 

注意:这会检查网络可用性。您可能会被连接到wifi,但您的wifi可能已连接到网络。