AsyncTask返回值

sis*_*sko 28 android return-value android-asynctask

我的Android应用程序连接到我的网站以检索和上传信息,因此我使用AsyncTask线程.

在一个实例中,我需要我的线程将true或false值返回给我的主线程.

有没有办法从AsyncTask执行函数获取此返回值?

当我执行以下操作时:

Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

我只是得到了很多胡言乱语.

我认为我需要的是暂停主线程直到第二个线程完成的方法.第二个线程调用主线程中的函数来设置我的返回值.所以当第二个线程完成时,主线程可以取消暂停并访问第二个线程设置的返回值. 如果这个逻辑是合理的,请提供建议......谢谢!

Ido*_*lon 40

您可以使用AsyncTask get()方法.它等待计算完成所需,然后检索其结果:

Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

但请确保不要长时间阻止主线程,因为这会导致UI和ANR无响应.

更新
我错过了关于异步网络下载/上传的问题.Web /网络操作应该被认为是一个很长的过程,因此"暂停UI线程并等到下载完成"的方法总是错误的.使用通常的结果发布方法(例如:AsyncTask.onPostExecuteService,sendBroadcast,Volley,RoboSpice,DataDroid等库).

  • 不要用得!!! 它冻结了用户界面.http://stackoverflow.com/questions/9019249/progressdialog-not-shown-when-asynctask-get-called(这发生在我身上,所以我发布这个我最初找到建议的地方) (8认同)

Sun*_*dey 4

onPostExcecute()处理程序是在方法中执行此操作的最佳方法,只需执行即可

@Override
    protected void onPostExecute(Boolean bool) {
        super.onPostExecute(bool);
           Message msg=new Message();
            msg.obj=bool;
            mHandler.sendMessage(msg);
        }
    }
Run Code Online (Sandbox Code Playgroud)

你的消息处理程序将是

mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
        bool i=(String)msg.obj;
    }
 };
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下使用处理程序是完全没有必要的。您可以通过处理程序将返回值发送到(可能)UI,但您可以通过简单地调用使用布尔值并更新 UI 的方法(主要是关闭对话框并更新视图内容)来访问“onPostExecute()”中的 UI。你做得比它应该做的更复杂...... (7认同)