whi*_*fin 0 android android-asynctask networkonmainthread
我正在尝试检查Android上的互联网连接(实际连接,而不是网络访问)NetworkOnMainThreadException.因此,我试图把它变成一个AsyncTask.
这是我的isConnected()方法:
if(!checkNetwork(parent)){
return false;
}
if(!checkConnection(url)){
return false;
}
return true;
Run Code Online (Sandbox Code Playgroud)
现在,我通过使用来检查连接,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;
}
}
Run Code Online (Sandbox Code Playgroud)
通过呼叫 if(!new ConnectUtils().isConnected(this, "http://google.com"))
这是一个示例代码:
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5824 次 |
| 最近记录: |