AsyncTask中的OnPostExecute方法可以返回值吗?

7
我正在开发一个需要使用AsyncTask进行网络连接的Android应用程序。我从主线程调用它,因此doInBackground方法运行并返回到onPostExecute方法。在执行完onPostExecute方法后,我想要将一个值从被调用的活动返回到活动中,因为我需要在该特定活动中执行一些操作,这些操作需要从onPostExecute方法返回的值。我该如何解决这个问题?我该如何从onPostExecute方法返回一个值?
谢谢您的帮助。

请参见以下链接内容:https://dev59.com/Vm035IYBdhLWcg3wYO51 和 https://dev59.com/Vm035IYBdhLWcg3wYO51 - ngesh
返回已解决的程序相关问题:查看此答案 - Adil Soomro
3个回答

8
AsyncTask,顾名思义,是在UI线程异步运行的,当doInBackground完成时,将在未来某个时间点调用onPostExecute方法。我们不关心onPostExecute方法何时被调用(实际上在项目构建时没有办法确定),我们唯一关心的是底层框架保证在未来的某个时间点正确地调用onPostExecute方法。因此,onPostExecute方法的目的是处理从工作线程返回的结果,这也是为什么onPostExecute方法的唯一参数是从doInBackground方法返回的结果。

我必须在那个特定的活动中执行一些操作,这需要返回自onPostExecute方法的值。我该怎么解决这个问题?

当然,您可以在Activity类中创建一些实例变量(或使用监听器模式)来存储返回的结果,并在onPostExecute方法准备好时使用。问题是,在项目构建时,您永远不知道这个结果何时在onPostExecute方法之外准备好,因为它实际上是在应用程序运行时确定的。除非您编写一些等待机制连续轮询结果,这会牺牲AsyncTask的好处,例如内置的API AsyncTask.get(),它使AsyncTask与UI线程同步运行并将结果返回给Activity。
最佳实践是改变你的设计,将需要从AsyncTask返回结果的操作代码移到onPostExecute方法中。希望这能帮到你。

@ManJan,我最近回答过类似的问题在这里,更详细地解释了AsyncTask如何与UI线程配合工作,希望这能帮到你。 - yorkw

5
你可以使用 getter 和 setter 从 AsyncTask 中获取返回值。
public class MainActivity extends Activity {
    public String retunnumfromAsyncTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layouttest);
        new Asyntask(this).execute();
    }

    public class Asyntask extends AsyncTask<Void, Void, String> {
        private final Context Asyntaskcontext;

        public Asyntask(Context context){
            Asyntaskcontext = context;
        }

        @Override
        protected void onPostExecute(String result) {
            MainActivity mainactivity = (MainActivity) Asyntaskcontext;
            mainactivity.retunnumfromAsyncTask = result;       
            super.onPostExecute(result);
        }
    }
}

1
只需将AsyncTask类作为您的活动的内部类编写,然后声明您想要返回的任何值作为全局变量。这对您有帮助吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接