【问题标题】:Can OnPostExcecute method in AsyncTask RETURN values?AsyncTask 中的 OnPostExcecute 方法可以返回值吗?
【发布时间】:2012-04-04 05:24:01
【问题描述】:

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

提前致谢

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

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

我必须在需要从 onPostExecute 方法返回的值的特定活动中进行一些操作。我该如何解决?

当然,您可以在 Activity 类中创建一些实例变量(或使用侦听器模式),在 onPostExecute 方法中存储返回并准备好的结果。问题是你永远不知道这个结果何时在项目构建时在 onPostExecute 方法之外准备好,因为它实际上是在应用程序运行时确定的。除非你写一些等待机制不断的轮询结果,从而牺牲了AsyncTask的好处,比如内置的APIAsyncTask.get()使得AsyncTask与UI线程同步运行并将结果返回给Activity。

最佳做法是更改您的设计并将需要从 AsyncTask 返回的结果的操作代码移动到 onPostExecute 方法中。希望这会有所帮助。

【讨论】:

  • @ManJan,我最近回答了一个类似的问题at here 解释更多关于 AsyncTask 如何与 UI 线程一起工作的细节,希望这会有所帮助。
【解决方案2】:

您可以使用 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);
        }
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多