0

我正在尝试检查 Android 上的互联网连接(实际连接,而不是网络访问),这会导致NetworkOnMainThreadException. 因此,我试图将其移至AsyncTask.

这是我的isConnected()方法:

if(!checkNetwork(parent)){
    return false;
}
if(!checkConnection(url)){
    return false;
}
return true;

现在,我只使用检查连接,if(isConnected())但出现异常。所以我需要做的就是将上面的方法移动到一个 AsyncTask 中并检索它返回的值。

我想也许我可以创建一个全局变量来跟踪它,但是我不确定我的值是否会在 AsyncTask 设置它之前或之后返回。

我确信有办法做到这一点,所以我正在寻找有关如何做到这一点的想法。任何建议表示赞赏!

编辑:我已经更新了我的代码以使用 AsyncTask,如果这看起来更好,请告诉我:

ConnectUtils.java:

public class ConnectUtils {

    private static boolean hasConnected, hasChecked;

    public boolean isConnected(Context parent, String url){ 
        hasChecked = false;
        this.new CheckURL(parent, url).execute();
        while(!hasChecked){ }
        return hasConnected;
    }

    private class CheckURL extends AsyncTask<Void, Void, Boolean>{

        private Context parent;
        private String url;

        public CheckURL(Context parent, String url){
            this.parent = parent;
            this.url = url;
        }

        @Override
        protected Boolean doInBackground(Void... params){
            if(!checkNetwork(parent)){
                return false;
            }
            if(!checkConnection(url)){
                return false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result){
            super.onPostExecute(result);
            hasConnected = result;
            hasChecked = true;
        }
    }

    private static boolean checkNetwork(Context parent){
        ConnectivityManager conMgr = (ConnectivityManager)parent.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(conMgr.getActiveNetworkInfo() != null){
            NetworkInfo activeInfo = conMgr.getActiveNetworkInfo();
            if(!activeInfo.isConnected() || !activeInfo.isAvailable()){
                return false;
            }
            return true;
        }
        return false;
    }

    private static boolean checkConnection(String url){
        boolean responded = false;
        HttpGet requestTest = new HttpGet(url);
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 3000);
        HttpConnectionParams.setSoTimeout(params, 5000);
        DefaultHttpClient client = new DefaultHttpClient(params);
        try {
            client.execute(requestTest);
            responded = true;
        } catch (Exception e){
            e.printStackTrace();
        }
        return responded;
    }
}

通过调用if(!new ConnectUtils().isConnected(this, "http://google.com"))

4

3 回答 3

8

这是一个示例代码:

new AsyncTask<Void, Void, Boolean>()
{
    @Override
    protected Boolean doInBackground(Void... p)
    {
        return isConnected();
    }

    @Override
    protected void onPostExecute(Boolean result)
    {
        //this is code for the UI thread, now that it knows what is the result.
    }
}.execute();
于 2013-08-25T20:08:12.257 回答
1

在您AsyncTaskonPostExecute方法中,在您的活动中调用一个函数来处理连接的(现在已知的)状态。在该方法执行之前,您的 UI 和/或内部逻辑应该反映连接的状态是未知的。

于 2013-08-25T19:55:09.483 回答
0

在Params = url, progress = void (nothing)的doInBackground()方法中检查连接,结果是一个布尔值。AsyncTask<Url, Void, Boolean>

onPostExecute()返回到应用程序的主线程

于 2013-08-25T19:58:55.793 回答