我创建了一个扩展类Asynctask
。此类从多个活动中调用。它从网页中获取一些数据。之后,根据url,在onPostExecute
方法中处理数据。现在我正在使用多个else if
语句,但它有点不方便。
有没有办法onPostExecute
在 Activity 中定义创建新的Asynctask
.
我认为它可能适用于接口或抽象方法,但不确定也不知道如何。
我创建了一个扩展类Asynctask
。此类从多个活动中调用。它从网页中获取一些数据。之后,根据url,在onPostExecute
方法中处理数据。现在我正在使用多个else if
语句,但它有点不方便。
有没有办法onPostExecute
在 Activity 中定义创建新的Asynctask
.
我认为它可能适用于接口或抽象方法,但不确定也不知道如何。
你可以在没有任何额外工作的情况下做到这一点。
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
}
};
您为 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()
。
另一种方法,更多的 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 实现的接口,它们是具体的类。
使用接口是最好的选择,但为简单起见,您还可以将 Runnable 传递给 AsyncTask,您可以在 onPostExecute() 方法中执行它。