调用新的Asynctask时定义onPostExecute

时间:2013-03-12 15:21:07

标签: java android interface abstract-class

我创建了一个扩展Asynctask的类。从多个活动中调用此类。它从网页获取一些数据。之后,根据网址,数据将在onPostExecute方法中处理。现在我正在使用多个else if语句,但它有点不方便。

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

我认为它可能适用于界面或抽象方法,但我不确定并且不知道如何。

4 个答案:

答案 0 :(得分: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             
        }
    };

答案 1 :(得分:5)

您为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()启动它。

答案 2 :(得分:0)

另一种方法,更多的java / generic,可以帮助改进你的代码,就是使用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实现的接口,它们是具体的类。

答案 3 :(得分:-1)

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