0

AsyncTask で Android にインターネット チェックを実装しようとしています。このために別のクラスファイルを作成しました。目的は、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;
        }
}
4

3 に答える 3

4

アクティビティ/フラグメントをコンテキストとして渡します。非常に単純な例として:

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

補足として、バックグラウンドでネットワーク情報を取得するのにそれほど時間がかかるかどうかはわかりません。

于 2013-07-06T13:32:07.840 に答える
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;
}

ネットワークで行うすべてのことについて、許可を忘れないでください。

于 2013-07-06T13:34:11.740 に答える
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();
  } 

注 : これにより、ネットワークの可用性がチェックされます。Wi-Fi に接続されている可能性がありますが、Wi-Fi はネットに接続されている可能性があります。

于 2013-07-06T13:35:56.007 に答える