0

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

有没有办法onPostExecute在 Activity 中定义创建新的Asynctask.

我认为它可能适用于接口或抽象方法,但不确定也不知道如何。

4

4 回答 4

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             
        }
    };
于 2013-03-12T15:38:16.770 回答
5

您为 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()

于 2013-03-12T15:32:38.540 回答
0

另一种方法,更多的 java/generic,可以帮助改进你的代码是使用策略模式。简而言之,对于每个不同的数据处理,您将创建一个实现相同接口的不同类。这样,添加新的“策略”就需要新的类,这样你的代码才会清晰。
例子:

 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 实现的接口,它们是具体的类。

于 2013-03-12T15:47:54.027 回答
-1

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

于 2013-03-12T15:59:18.883 回答