2012-05-26 2 views
17

저는 AsyncTask에 대해 배우기 만하고 하위 클래스가 아닌 별도의 클래스로 사용하려고합니다.안드로이드, AsyncTask를 별도의 클래스에 넣고 콜백 할 수 있습니까?

예를 들어

,

class inetloader extends AsyncTask<String, Void, String> { 


    @Override 
    protected String doInBackground(String... urls) { 

     String response = ""; 

      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(urls[0]); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     return response; 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     Log.e("xx",result); 
     // how do I pass this result back to the thread, that created me? 
    } 


} 

주 (UI) 스레드 :

inetloader il = new inetloader(); 
il.execute("http://www.google.com"); 
//il.onResult() 
//{ 
    ///do something... 
//} 

감사합니다!

+1

예, 별도의 클래스에 넣을 수 있지만 대부분의 사람들은 그 purpo se는 대개 내부 클래스 인 경우 더 명확합니다. 당신이 많은 활동에서 그것을 재사용 할 것이라면, 계속하십시오. – keyser

+0

다른 용도로 사용하고 싶습니다. 여기에서 전화를 걸면 결과에서 그걸해야합니다. 그곳에서 전화를 걸면 결과에 다른 것을해야합니다 ... 그럴 경우 계속 해두십시오. 동일한 클래스에서 결과에 대해 해당 클래스의 함수를 호출해야합니다. 결과에 따라 수행해야하는 모든 종류의 작업에 대해 새 AsyncTask를 만들어야합니다. –

+0

인터페이스를 사용하여 인터페이스를 사용하면됩니다. Asyn 클래스의 onPostExcute()에서 mContext.implementedMethod()를 호출합니다. –

답변

32

인터페이스를 사용하십시오.

inetloader il = new inetloader(); 
li.setListener(this); 
il.execute("http://www.google.com"); 

inetloader에서 추가, : : 뭔가 같은 :

interface CallBackListener{ 
    public void callback(); 
} 

그런 다음 당신의 UI 스레드에서이 작업을 수행 postExecute()에서 다음

CallBackListener mListener; 

    public void setListener(CallBackListener listener){ 
    mListener = listener; 
    } 

을 수행

mListener.callback(); 
+0

감사합니다. 올바른 방향 인 것처럼 들리겠습니다. 특히 inetloader il = new inetloader()를 사용하여 CallBackListener를 만들 수 있다면; 이것을 il 객체에 전달합니다. –

+0

흠 ... 이상 하네, 안드로이드 v3에 "CallBackListener"가 없네요, 다른 이름이 될까요? –

+3

@RogerTravis 네, 직접 CallBackListener 인터페이스를 만들어야합니다.그리고 기본 UI 클래스에 "CallBackLisnter 구현"을 추가하는 것을 잊지 마십시오. –

1
inetloader il = new inetloader(); 
il.execute("http://www.google.com"); 

String result = il.get();//put it in try-catch 
       ^^^^^^^^ 

here you get result which is in onPostExecute(String result)

+0

사실, 필자는 onResult 리스너를 필요로합니다. 일부 서버를 쿼리하는 데 시간이 걸리기 때문에 AsyncTask가 완료되면 트리거됩니다. 반면에 il.get()을 while (true) 루프에 넣으면 너무 원시적 인 것처럼 들릴지도 모릅니다. :) 더 좋은 선택이 있습니까? –

+2

@Samir : 이것은 정말 좋은 생각입니다. 'AsyncTask'로부터 결과를 얻는 것이 가능하지만,'get()'메소드를 사용하면 UI 쓰레드가 차단되어 비동기 프로 시저를 동기식으로 변환 할 수 있습니다. 'get()'메소드에 대한 유일한 유효한 사용법은 두 개의 'AsyncTasks'를 '연결'하는 것입니다. – Squonk

3

당신은
사용 인터페이스처럼 ... 생성자와 거기에서 활동 함수를 호출하는 활동 인스턴스를 전달할 수 있습니다

public interface ResultUpdatable { 

    public void setResult(Object obj); 
    } 

이 활동이 구현하고있는 통과 비동기 작업의 생성자이며 onPostExecute에서 결과를 setResult 함수를 사용하여 업데이트하십시오.

관련 문제