2013-03-12 2 views
0

Asynctask 확장 클래스를 만들었습니다. 이 클래스는 여러 활동에서 호출됩니다. 웹 페이지에서 데이터를 가져옵니다. 그런 다음 URL에 따라 데이터가 onPostExecute 방법으로 처리됩니다. 지금은 여러 개의 else if 문을 사용하고 있지만 조금은 이해하기 힘듭니다.새 Asynctask가 호출 될 때 onPostExecute를 정의합니다.

Asynctask을 새로 만드는 액티비티에서 onPostExecute 메서드를 정의하는 방법이 있습니까?

나는 그것이 인터페이스 나 추상적 인 방법으로는 잘 될지 모르지만, 잘 모르겠다.

답변

4

onPostExecute이 실행될 때 호출 할 AsyncTask에 이벤트 리스너를 등록합니다.

public class Example extends AsyncTask<Void, Void, Void> { 

    public interface ExampleListener { 
    public void onStart(); 
    public void onProgress(); 
    public void onFinish(); 
    } 

    private ExampleListener listener; 

    public Example(ExampleListener listener) { 
    mListener = listener; 
    } 

    @Override 
    public void onPreExecute() { 
    ... 
    mListener.onStart(); 
    ... 
    } 

    @Override 
    public void onProgressUpdate(Void... v) { 
    ... 
    mListener.onProgress(); 
    ... 
    } 

    @Override 
    public void onPostExecute(Void result) { 
    ... 
    mListener.onFinish(); 
    ... 
    } 
} 

필요한 디자인에 맞게 패턴을 사용자 정의하십시오. 리스너가 각 이벤트에 대해 가질 필요가있는 인터페이스 매개 변수에 대한 매개 변수를 포함하십시오. Example.ExampleListener을 구현하는 클래스가있는 경우 new Example(this).execute()을 호출하기 만하면됩니다.

+0

나는 listener.onFinish()가 호출 될 때 nullpointerexception을 얻었습니다. 하지만 난 생성자에서 수신기를 초기화했습니다 – Cheetah

+0

'onFinish()'메서드 또는 당신이'onFinish()'를 호출했을 때 nullPointerException을 얻었습니까? – DeeV

+0

내가 onFinish()를 호출 할 때. 청취자가 null 같아 보이는 것 같습니다. – Cheetah

6

추가 작업없이 수행 할 수 있습니다.

public class MyTask extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     // do some work 
     return null; 
    } 

} 

그리고 활동에

:

MyTask t = new MyTask() 
    { 
     @Override 
     protected void onPostExecute(Void result) 
     { 
      super.onPostExecute(result); 
      // do some work    
     } 
    }; 
0

또 다른 방법은 일반 더 자바는 /, 즉 Strategy 패턴을 사용하는 것입니다 코드를 향상시킬 수있다. 간단히 말해, 각각의 다른 데이터 처리에 대해 동일한 인터페이스를 구현하는 다른 클래스를 작성하게됩니다. 그런 식으로 새로운 "전략"을 추가하면 코드가 명확해질 수 있도록 새로운 클래스가 필요할 것입니다.
예 : ResponParser 구체적인 클래스이다 ResponParser1 및 ResponParser1 모두에 의해 구현되는 인터페이스

public void onPostExecute(String result){ 
ResponParser responseParser; 

if (result.equals("http://..1")); 
responseParser = new ResponParser1(); 
else if (result.equals("http://..2")); 
responseParser = new ResponParser1(); 

responseParser.parse(); 
} 

.

-1

인터페이스를 사용하는 것이 가장 좋은 방법이지만, 단순화하기 위해 onPostExecute() 메소드에서 실행할 수있는 Runnable을 AsyncTask에 전달할 수도 있습니다.

관련 문제