您好我仍然是Android编程的新手,我最近偶然发现了一个关于AsyncTasks的相当抽象的问题。
根据我的理解,在AsyncTask执行runInBackground之后,它会向onPostExecute返回一个值,在那里它使用结果执行UI线程。现在,如果我想对runInBackground返回的结果做不同的事情,该怎么办?我已经看过这样的提议示例(取自here):
private class MyCustomAsyncTask extends AsyncTask<Void, Void, Void>{
private boolean mShouldCallMethod1;
public MyCustomAsyncTask(boolean shouldCallMethod1){
mShouldCallMethod1 = shouldCallMethod1;
}
@Override
protected Void doInBackground(Void... params) {
//code goes here..
return null;
}
@Override
protected void onPostExecute(Void result) {
if(mShouldCallMethod1){
method1();
}else{
method2();
}
}
}
但是如果我想要onPostExecute应该做的事情超过两件(例如method3,method4等等)?当然,我可以实现一个switch
和一些int变量来确定要调用的方法,等等,但这似乎相当愚蠢和冗余。函数模型返回结果而不管其目的对我来说似乎很直接。但在AsyncTask中,似乎我必须指定一个目的。我想知道是否存在是一种AsyncTask可以实现类似函数的方式。
例如,我有一个使用URL获取图像的AsyncTask。此图片可用于填充ImageView
,也可以保存到图库。所以他们在runInBackground
中基本上做了同样的事情,但他们的结果需要以不同的方式处理。
我还是初学者所以如果我错过了一些简单的细节/概念,我会道歉。 提前谢谢。
答案 0 :(得分:0)
您调用asyncTask的位置将决定您放置图像的用途。您将图像返回到该点并将其用于您进行呼叫的目的。
答案 1 :(得分:0)
如果你觉得开关很笨,你就有很好的OO本能。并且有充分的理由避免AsyncTask
。但把它放在一边,专注于你的问题......
如果你有一堆AsyncTask
在doInBackground
中执行相同的操作,但需要在onPostExecute
中执行不同的操作,这是匿名子类的经典案例。首先,在doInBackground
中实施MyCustomAsyncTask
。然后在Activity
或需要使用它的任何地方,声明并使用匿名子类。
mAsyncTask = new MyCustomAsyncTask(/* constructor params */) {
@Override
protected void onPostExecute(Void result) {
// can access activity members here
mAsyncTask = null;
}
}.execute();
确保在onPause
或onDestroy
中取消正在运行的任务。
if(mAsyncTask != null) {
mAsyncTask.cancel();
mAsyncTask = null;
}