AsyncTask执行后执行不同的操作?

时间:2017-07-01 21:16:50

标签: java android android-asynctask

您好我仍然是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中基本上做了同样的事情,但他们的结果需要以不同的方式处理。

我还是初学者所以如果我错过了一些简单的细节/概念,我会道歉。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您调用asyncTask的位置将决定您放置图像的用途。您将图像返回到该点并将其用于您进行呼叫的目的。

答案 1 :(得分:0)

如果你觉得开关很笨,你就有很好的OO本能。并且有充分的理由避免AsyncTask。但把它放在一边,专注于你的问题......

如果你有一堆AsyncTaskdoInBackground中执行相同的操作,但需要在onPostExecute中执行不同的操作,这是匿名子类的经典案例。首先,在doInBackground中实施MyCustomAsyncTask。然后在Activity或需要使用它的任何地方,声明并使用匿名子类。

mAsyncTask = new MyCustomAsyncTask(/* constructor params */) {
    @Override
    protected void onPostExecute(Void result) {
        // can access activity members here
        mAsyncTask = null;
    }
}.execute();    

确保在onPauseonDestroy中取消正在运行的任务。

if(mAsyncTask != null) {
    mAsyncTask.cancel();
    mAsyncTask = null;
}