2012-12-28 3 views
0

로컬 네트워크의 호스트에 연결하려고합니다. 그것에 도달하면 내 컴퓨터 또는 내 안드로이드 전화 (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()를 호출 할 생각하지 않는다

+1

'AsyncTask'의'get()'메소드를 사용하는 것은 완전히 무의미하다. 비동기 작업을 동기 작업으로 변환하고 기본적으로 호출하는 스레드를 차단합니다. 이것이'Activity'에서 온 것이라면, 이것은 메인 (UI) 쓰레드를 막을 것이고 UI를 만드는 데 문제를 일으킬 것이고 (당신이 어디에서 호출했는지에 따라) ANR 상황을 일으킬 수 있습니다. 당신은'AsyncTask'를'Activity'의 내부 클래스로 만들어야합니다. codeMagic은 AsyncTask의'onPostExecute (...)'메소드에서 UI 컴포넌트를 조작 할 수 있다고 제안합니다. – Squonk

답변

1

. 연결된 변수가 설정되었는지 확인하려면 의 결과가 전송되므로 onPostExecute()Lof을 사용하십시오. 만약 당신이 무언가를 할 필요가 있다면 onPostExecute()에서도 할 수있다.

+0

그 상태에 따라 사용자에게 메시지를 인쇄하거나 단추 아이콘 등을 바꾸고 싶기 때문에 connector.execute()를 호출하면 "connected"가 필요합니다. – bogus

+0

Async가 호출 클래스의 내부 클래스이고 연결된 main 클래스의 필드 변수를 사용하면 비동기에서 액세스 할 수 있습니다. 그렇지 않으면 호출 클래스에서'onPostExecute() '를 통해 해당 변수를 설정하는 메소드를 호출 할 수 있습니다. – codeMagic

+0

필드로 연결된 OOP 관점에서 볼 때 활동의 특징이 아니기 때문에 약간 망설였습니다. 이것은 Connector의 속성입니다. 그러나 이것은 확실히 작동합니다. 감사합니다 – bogus

관련 문제