NetworkOnMainThreadException
이 발생하는 Android (실제 네트워크 연결과 반대되는 연결)에서 인터넷 연결을 확인하려고합니다. 이 때문에 나는 그것을 AsyncTask
으로 옮기려고합니다.부울을 반환하는 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"))
당신을위한 들여 쓰기를 수정했습니다. –
들여 쓰기를 "고정"하지 않았습니다. 전에는 괜찮 았어. 그것은 "whitesmiths 코드 스타일"이라고 불립니다. 그것에 대해 읽어보십시오 : http://en.wikipedia.org/wiki/Indent_style#Whitesmiths_style. 코드를 원래대로 되돌려 놓았습니다. 나는 많은 회사와 일해 왔고, 각각은 독자적인 들여 쓰기 규칙을 가지고 있습니다. "올바른"방법이 없기 때문에 수정할 것이 없습니다. 들여 쓰기를하는 기본적인 방법 중 하나이기 때문에 개발자라면 쉽게 읽을 수 있어야합니다. –
@androiddeveloper 그래서'boolean b = new AsyncTask(). execute();'와 같은 것을 할 수 있습니다. (내가 틀렸다는 것을 알지만, 의미를 알아야한다.) – whitfin