2012-05-19 3 views
0

Android에서 애플리케이션을 개발 중입니다. 응용 프로그램은 특정 웹 서버에 HTTP 요청을 게시 할 수 있습니다. 게시물 요청은 비동기 적으로 실행되어야하므로 작업을 수행 할 스레드를 만듭니다. 하지만 스레드 끝에서 호출 될 콜백이 필요하며`post` 메서드를 호출하는 스레드에서 호출해야합니다.Android : 특정 스레드에서 메소드 실행

post 방법은 다음과 같습니다

interface EndCallback 
{ 
    public void Success(String response); 
    public void Fail(Exception e); 
} 

public void post(final String url, final List<NameValuePair> data, EndCallback callback) 
{ 
    Thread t = Thread.currentThread(); 
    (new Thread() 
    { 
     public void run() 
     { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      try 
      { 
       httppost.setEntity(new UrlEncodedFormEntity(data)); 
       HttpResponse r = httpclient.execute(httppost); 

       HttpEntity en = r.getEntity(); 
       String response = EntityUtils.toString(en); 

       //I want to call callback.Success(response) 
       //here from thread t 
      } 
      catch (Exception ex) 
      { 
       //And I want to call callback.Fail(ex) 
       //here from thread t 
      } 
     } 
    }).start(); 
} 
+0

Handler, AsyncTask 또는 Activity 또는 View에 Runnable 인스턴스를 게시하는 등의 다양한 옵션에 대해서는 [Painless Threading] (http://developer.android.com/resources/articles/painless-threading.html)을 참조하십시오. –

답변

1

는 안드로이드가 매우는 대부분의 응용 프로그램에 대한 실망 입니다 새 스레드를 생성. 이것은 AsyncTask에 대한 완벽한 장소처럼 보입니다. 스레드 생성을 수동으로 관리 할 필요없이 스레드간에 전환하는 기본 제공 메소드가 있습니다. 내가 비슷한 상황에 사용했습니다

한 가지 방법은 가능한 성공 상태의 enum와 함께 작업을 결합하는 것입니다 :

class HttpPostTask extends AsyncTask<Void, Void, ResponseStatus> { 

    @Override 
    protected ResponseStatus doInBackground(Void... params){ 

     try { 
      // do your HTTP stuff 
      return ResponseStatus.SUCCESS; 
     } catch(Exception e){ 
      return ResponseStatus.FAILURE; 
     } 

    } 

    @Override 
    protected void onPostExecute(ResponseStatus status){ 
     switch(status){ 
     case SUCCESS: 
      // run your success callback 
      break; 
     case FAILURE: 
      // run the failure callback 
      break; 
     } 
    } 

} 

enum ResponseStatus { 
    SUCCESS, 
    FAILURE 
} 

doInBackground 방법은 OS에 의해 관리, 별도의 스레드에서 실행됩니다. 해당 스레드가 완료되면 onPostExecute은 작업을 시작한 스레드 (일반적으로 UI 스레드)에서 실행됩니다.

콜백 객체를 설정해야하는 경우 HttpPostTask에 생성자를 추가하고 필요한 초기화를 수행하면됩니다. 클라이언트 코드는 바로 작업을 생성하고 실행해야합니다 또한 클래스 서명의 첫 번째 제네릭 형식의 가변 수의 인수를 받아들이는뿐만 아니라 execute()에 매개 변수를 전달할 수 있습니다

new HttpPostTask().execute(); 

. doInBackground에있는 params 변수는 실행에 전달 된 모든 유형의 배열입니다.

execute에 매개 변수를 전달하는 것은 예를 들어 여러 URL에 게시하려는 경우 유용합니다. 대부분의 종속성의 경우 생성자에서 설정하는 것이 가장 간단한 방법입니다.

+0

완벽한 답을 ... 그러나 매개 변수를'execute()'메서드에 전달할 수 있습니까? 아니면 생성자에 매개 변수를 전달해야합니까? –

+1

@NiyokoYuliawan - 예, 방금 답변의 끝을 업데이트했습니다. – derekerdmann

2

당신은 핸들러를 사용할 수 있습니다. 처리기는 GUI 스레드에 요청을 게시하는 데 사용됩니다. 다음 코드를 성공 취급, 사용에 대한

는 :

final Handler successHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message message) 
    { 
     callback.Success(response); 
    } 
}; 

successHandler.sendEmptyMessage(0);