我创建了一个扩展为Asynctask
的类。这个类是从多个活动中调用的。它从网页获取一些数据。之后,根据url,数据在onPostExecute
方法中处理。现在我使用多个else if
语句,但它有点不方便。当新的Asynctask被调用时定义onPostExecute
有没有办法在创建新的Asynctask
的活动中定义onPostExecute
方法。
我认为它可能与接口或抽象方法一起工作,但我不确定,也不知道如何。
我创建了一个扩展为Asynctask
的类。这个类是从多个活动中调用的。它从网页获取一些数据。之后,根据url,数据在onPostExecute
方法中处理。现在我使用多个else if
语句,但它有点不方便。当新的Asynctask被调用时定义onPostExecute
有没有办法在创建新的Asynctask
的活动中定义onPostExecute
方法。
我认为它可能与接口或抽象方法一起工作,但我不确定,也不知道如何。
您为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()
来启动它。
你可以做任何额外的工作。
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
}
};
的另一种方式,更多的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其是具体类实现的接口。
使用接口是最好的选择,但为了简单起见,您还可以将Runnable传递给可以在onPostExecute()方法中执行的AsyncTask。
我试过了,但在调用listener.onFinish()时得到一个nullpointerexception。但我在构造函数中初始化了监听器 – Cheetah 2013-03-12 16:56:22
您是否在方法'onFinish()'或调用'onFinish()'时获得nullPointerException?当我打电话给Finish()时,我的电话号码是 – DeeV 2013-03-12 17:06:24
。好像听众等于null – Cheetah 2013-03-12 17:09:56