AsyncTask RETURN值中的OnPostExcecute方法可以吗?

时间:2012-04-04 05:24:02

标签: android android-asynctask

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

先谢谢

3 个答案:

答案 0 :(得分:8)

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

  

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

原因是,您可以在Activity类中创建一些实例变量(或使用listerner模式),并在onPostExecute方法中返回并准备好结果。问题是你永远不知道在项目构建时在onPostExecute方法之外何时准备好这个结果,因为它实际上是在app运行时确定的。除非你编写一些持续轮询结果的等待机制,否则会牺牲AsyncTask的好处,例如,内置的API AsyncTask.get()使得AsyncTask与UI线程同步运行并将结果返回给Activity。

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

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分:1)

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