我创建了一个扩展Asynctask
的类。从多个活动中调用此类。它从网页获取一些数据。之后,根据网址,数据将在onPostExecute
方法中处理。现在我正在使用多个else if
语句,但它有点不方便。
有没有办法在创建新onPostExecute
的活动中定义Asynctask
方法。
我认为它可能适用于界面或抽象方法,但我不确定并且不知道如何。
答案 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()方法中执行。