繁体   English   中英

使用类扩展asynctask来检查android活动中的互联网连接

[英]Using class extending asynctask to check internet connection in android activity

通过检查这里的一些问题,我设法创建了以下类,以检查用户是否具有有效的互联网连接。 我想在我的android活动中使用它来检查连接,然后再从互联网加载任何数据。 我想问一下这是否是检查用户互联网连接的合适方法,并且我希望有人提供一个示例,说明如何从活动中调用该活动(如何将上下文传递给活动以及如何获得true/false响应返回到我的android活动中。

public class ConnectionStatus  {
private Context context;

public ConnectionStatus(Context context){
    this.context=context;
}
public static boolean isNetworkAvailable(Context c) {
    NetworkInfo netInfo = null;
    try {
        ConnectivityManager cm = (ConnectivityManager) c
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        netInfo = cm.getActiveNetworkInfo();
    } catch (SecurityException e) {
        e.printStackTrace();
    }
    return netInfo != null && netInfo.isConnectedOrConnecting();
}
public boolean CheckConnection() {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection)
                    (new URL("http://clients3.google.com/generate_204")
                            .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500);
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                    urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e("TAG", "Error checking internet connection", e);
        }
    } else {
        Log.d("TAG", "No network available!");
    }
    return false;
}
}

我会在“异步任务”之外获取网络信息,因为您可以更轻松地处理如何对给定的网络状态做出反应。

对于异步任务,您可以使其成为Activity的内部类,并在调用异步任务的execute方法之前检查网络状态。

public class MyActivity extends Activity{

...
...
  private static boolean isNetworkAvailable(Context c) {
    NetworkInfo netInfo = null;
    try {
      ConnectivityManager cm = (ConnectivityManager) c
            .getSystemService(Context.CONNECTIVITY_SERVICE);
      netInfo = cm.getActiveNetworkInfo();
    } catch (SecurityException e) {
      e.printStackTrace();
    // Something bad happen, better return false.
      return false;
    }
    return netInfo != null && netInfo.isConnectedOrConnecting();
  }

//Let's assume you will call your data from the internet like this
  private void getDataFromTheInternet(){
  if (isNetworkAvailable){
     ConnectionStatus cStatus = new ConnectionStatus(getApplicationContext());
    cStatus.execute();
  }else{
  //Prevent the user that there is not a network connection
  }
}

现在,从Asynk任务中删除isNetworkAvailable methof,然后开始。

此外,您可以使用BroadCast接收器在每次连接状态更改时进行检查,以便您的应用程序可以在脱机或在线时做出反应,请按照本教程进行操作

这是一个包含AsyncTask的Activity类的示例,并显示了如何在问题的更新版本中使用ConnectionStatus类。

public class MainActivity extends AppCompatActivity {

    TextView textView;

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

        textView = (TextView) findViewById(R.id.text);

        //Create Strings to pass to varargs of AsyncTask
        String s1 = "test1";
        String s2 = "test2";
        new MyAsync().execute(s1, s2);

    }

    class MyAsync extends AsyncTask<String, String, String> {

        ConnectionStatus status;

        @Override
        protected void onPreExecute() {

        }

        @Override
        protected String doInBackground(String... params) {

            String retVal = null;

            //Instantiate your object, use MainActivity.this for Context
            status = new ConnectionStatus(MainActivity.this);

            //capture varargs
            String sOne = params[0];
            String sTwo = params[1];

            boolean something = false;

            //Check network connectivity:
            if (status.CheckConnection()){

                //You have internet, do your network operations here
                //...............

                //Just here for an example:
                if (something == true){
                    retVal = sOne;
                }
                else{
                    retVal = sTwo;
                }

            }

            return retVal;
        }

        @Override
        protected void onPostExecute(String arg) {
            //Update UI here, this runs on the Main UI thread of the Activity
            if (arg != null){
                textView.setText(arg);
            }
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM