【问题标题】:How to perform AsyncTask for checking internet connection如何执行 AsyncTask 以检查 Internet 连接
【发布时间】:2014-06-11 03:28:41
【问题描述】:

我有以下代码,我想做的是以编程方式检查是否有互联网连接。
由于我收到 NetworkOnMainThreadException,因此被建议使用 AsyncTask。
我想在 hasActiveInternetConnection(Context context) 上执行网络操作,如果连接到网络则返回 true,否则返回 false。
如何使用 AsyncTask 执行此操作?

 public class NetworkUtil extends AsyncTask<String, Void, String>{
        Context context;

        public NetworkUtil(Context context){
            this.context = context;
         }

    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... arg0) {
        if (new CheckNetwork(context).isNetworkAvailable()) 
        {
             try {
                 HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
                 urlc.setRequestProperty("User-Agent", "Test");
                 urlc.setRequestProperty("Connection", "close");
                 urlc.setConnectTimeout(1500); 
                 urlc.connect();
                 boolean url= (urlc.getResponseCode() == 200);
                 String str = String.valueOf(url);
                 return str;
             } catch (IOException e) {

             }
         } 


            // your get/post related code..like HttpPost = new HttpPost(url);
         else {
            Toast.makeText(context, "no internet!", Toast.LENGTH_SHORT).show();
        }


        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }
    }

【问题讨论】:

  • 您要检查您是否有联系或不做员工?或者您想等到有互联网连接后再做员工?
  • @ahmed 我只想检查互联网连接,如果连接存在,那么我想返回 true !

标签: android android-asynctask


【解决方案1】:

使用此类检查互联网连接...

public class CheckNetwork {
private Context context;

public CheckNetwork(Context context) {
    this.context = context;
}

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

}

然后.....

将这个 ASynTask 用于 httppost。

public class NetworkUtil extends AsyncTask<String, Void, String> {

private ProgressDialog dialog;

@Override
protected void onPreExecute() {
    dialog = new ProgressDialog(YourActivity.this);
    dialog.setMessage("Loading...");
    dialog.setCancelable(false);
    dialog.show();
    super.onPreExecute();
}

@Override
protected String doInBackground(String... arg0) {
    if (new CheckNetwork(YourActivity.this).isNetworkAvailable()) {
        // your get/post related code..like HttpPost = new HttpPost(url);
    } else {
        // No Internet 
        // Toast.makeText(YourActivity.this, "no internet!", Toast.LENGTH_SHORT).show();
    }
    return null;
}
@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    if (dialog.isShowing()) {
        dialog.dismiss();
    }
}

【讨论】:

  • 非常感谢...我已经更新了上面的代码...您能否确认我是否走对了路。以及如何获得该返回 str;在另一个类中的价值?泰!
  • 你要做两件事... 1。在调用 NetworkUtil 类时发送 YourActivity.this 而不是 getApplicationContext()。 2.将str变量设为类变量,bu声明.. public static String str;
  • 并且还写... dialog = new ProgressDialog(YourActivity.this); dialog.setMessage("加载中..."); dialog.setCancelable(false); dialog.show(); 在 onPreExecute() 方法中
  • 泰!!很快就会尝试!
  • 这应该是公认的答案。 Google.com 可能有一天会倒闭 ;-)
【解决方案2】:
There is no way to get an Internet connexion state, you will always have the network connection state.

但我找到了一个很好的答案here:您向 google.com 发送请求! :) 如果你愿意,你也可以尝试通过 unix 命令 ping 到谷歌!!

这里的家伙正在使用一个线程,并稍等片刻等待答案,然后返回一个布尔值。你在处理程序中做你的员工。这是他的代码:

public static void isNetworkAvailable(final Handler handler, final int timeout) {
    // ask fo message '0' (not connected) or '1' (connected) on 'handler'
    // the answer must be send before before within the 'timeout' (in milliseconds)

    new Thread() {
        private boolean responded = false;   
        @Override
        public void run() { 
            // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 
            new Thread() {      
                @Override
                public void run() {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try {
                        new DefaultHttpClient().execute(requestForTest); // can last...
                        responded = true;
                    } 
                    catch (Exception e) {
                    }
                } 
            }.start();

            try {
                int waited = 0;
                while(!responded && (waited < timeout)) {
                    sleep(100);
                    if(!responded ) { 
                        waited += 100;
                    }
                }
            } 
            catch(InterruptedException e) {} // do nothing 
            finally { 
                if (!responded) { handler.sendEmptyMessage(0); } 
                else { handler.sendEmptyMessage(1); }
            }
        }
    }.start();
}

然后,我定义处理程序:

Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }   
    }
};

...并启动测试:

isNetworkAvailable(h,2000); // get the answser within 2000 ms

【讨论】:

  • ty ...试试这个!
  • 运行良好!稍后将确认这是否运作良好! ty 代码顺便说一句:)
  • 完美工作 :)
【解决方案3】:

您的AsyncTask 应如下所示:

 private class NetworkUtilTask extends AsyncTask<Void, Void, Boolean>{
    Context context;

    public NetworkUtilTask(Context context){
        this.context = context;
     }

     protected Boolean doInBackground(Void... params) {
         return hasActiveInternetConnection(this.context);
     }
     protected void onPostExecute(Boolean hasActiveConnection) {
         Log.d(LOG_TAG,"Success=" + hasActiveConnection);
     }
 }

然后你会像下面这样执行它:

NetworkUtilTask netTask = new NetworkUtilTask(context);
netTask.execute();

【讨论】:

  • 看起来不错,应该是正确的答案。我不明白为什么在异步任务中使用它?你能解释一下这个技巧的优点或用例吗?
  • 因为上下文被传递给构造函数,所以我使用了this,因为还有任务变量context。基本上这只是避免歧义。 read up on this
  • 我无法将受保护的字符串 doInBackground(String...params) 更改为受保护的布尔 doInBackground(Void...params) 我该怎么做?泰!
  • 我很抱歉造成混乱,我使用的是普通词“this”而不是“this”。我的问题是,为什么要使用异步任务来检查互联网连接?再次感谢
  • @ahmed_khan_89 我的帖子试图回答 OP 的问题,但你说得对。无需异步即可确定您是否有连接
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多