로컬 네트워크의 호스트에 연결하려고합니다. 그것에 도달하면 내 컴퓨터 또는 내 안드로이드 전화 (SGS2)에서 작동하고 그것도 내 응용 프로그램과 함께 작동하지만, 그것은 작동하는지 그리고 추가 작업을 진행에 따라 결과를 확인하고 싶습니다.ASyncTask에서 결과를 얻는 방법?
Connector라는 ASyncTask 구현을 사용하고 있습니다. Connector를 호출 할 때 execute를 호출 할뿐만 아니라 get()을 호출하여 성공을 나타내는 부울 값을받습니다. 여기서 문제는 실행이 잘 수행된다는 것입니다 (호스트에 확실히 도달하여 doInBackground의 중단 점에 착륙합니다.)
doInBackground에서 반환하는 부울 값을 어떻게받을 수 있습니까? get 완료 ...
기본적으로 신경 쓰이는 변수는 "connected"이지만 get()은 영구적으로 실행되는 것처럼 보입니다. 매니페스트에서 권한이 부여되고 휴대 전화의 wifi가 작동하고 작동 할 수 있습니다. 호스트
이것은 내가 실행하는 곳이다. 커넥터 :
url = new URL("http://192.168.2.103/?LED=T");
Connector connector = new Connector();
AsyncTask<URL, Integer, Boolean> execute = connector
.execute(url);
Status status = execute.getStatus();
boolean connected = false;
try {
Log.d("MainActivity", "trying to get result");
connected = connector.get();
Log.d("MainActivity", "got result");
} catch (InterruptedException ie) {
ie.printStackTrace();
} catch (ExecutionException ee) {
ee.printStackTrace();
}
System.out.println();
} catch (MalformedURLException e) {
e.printStackTrace();
}
//do something depending on connected
그리고 이것은 커넥터입니다 :
public class Connector extends AsyncTask<URL, Integer, Boolean> {
public static boolean connect(URL url) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url.toString());
System.out.println();
try {
HttpResponse response = httpclient.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
Log.d("myapp", "response " + response.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
protected Boolean doInBackground(URL... params) {
boolean connect = connect(params[0]);
return connect;
}
@Override
protected void onPostExecute(Boolean result) {
Log.d("Connector", "onPostExecute");
super.onPostExecute(result);
}
} 난 당신이 이미 execute()
으로 AsyncTask를 실행 한 이후 get()
를 호출 할 생각하지 않는다
'AsyncTask'의'get()'메소드를 사용하는 것은 완전히 무의미하다. 비동기 작업을 동기 작업으로 변환하고 기본적으로 호출하는 스레드를 차단합니다. 이것이'Activity'에서 온 것이라면, 이것은 메인 (UI) 쓰레드를 막을 것이고 UI를 만드는 데 문제를 일으킬 것이고 (당신이 어디에서 호출했는지에 따라) ANR 상황을 일으킬 수 있습니다. 당신은'AsyncTask'를'Activity'의 내부 클래스로 만들어야합니다. codeMagic은 AsyncTask의'onPostExecute (...)'메소드에서 UI 컴포넌트를 조작 할 수 있다고 제안합니다. – Squonk