2013-03-12 35 views
0

我创建了一个扩展为Asynctask的类。这个类是从多个活动中调用的。它从网页获取一些数据。之后,根据url,数据在onPostExecute方法中处理。现在我使用多个else if语句,但它有点不方便。当新的Asynctask被调用时定义onPostExecute

有没有办法在创建新的Asynctask的活动中定义onPostExecute方法。

我认为它可能与接口或抽象方法一起工作,但我不确定,也不知道如何。

回答

4

您为AsyncTask注册一个事件侦听器,它将在onPostExecute运行时调用。

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 2013-03-12 16:56:22

+0

您是否在方法'onFinish()'或调用'onFinish()'时获得nullPointerException?当我打电话给Finish()时,我的电话号码是 – DeeV 2013-03-12 17:06:24

+0

。好像听众等于null – Cheetah 2013-03-12 17:09:56

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

的另一种方式,更多的Java /通用的,可以帮助提高你的代码是使用Strategy模式。 总之,对于每种不同的数据处理,您都可以创建一个实现相同接口的不同类。这样,添加新的“策略”就需要新的类,这样你的代码才会清晰。
实施例:

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(); 
} 

其中ResponParser是由两个ResponParser1和ResponParser1其是具体类实现的接口。

-1

使用接口是最好的选择,但为了简单起见,您还可以将Runnable传递给可以在onPostExecute()方法中执行的AsyncTask。

相关问题