如何从android中的asynchronous任务返回值

我创build了一个asynchronous任务来调用我的服务器从数据库中获取数据。
我需要处理从http服务器调用返回的结果。
从我的活动,我在许多地方调用asynchronous任务。 所以我不能使用成员variables来访问结果。 有什么办法吗?

public Result CallServer(String params) { try { new MainAynscTask().execute(params); } catch(Exception ex) { ex.printStackTrace(); } return aResultM;//Need to get back the result } private class MainAynscTask extends AsyncTask<String, Void, Result> { @Override protected Result doInBackground(String... ParamsP) { //calling server codes return aResultL; } @Override protected void onPostExecute(Result result) { super.onPostExecute(result); //how i will pass this result where i called this task? } 

Solutions Collecting From Web of "如何从android中的asynchronous任务返回值"

尝试在调用execute()方法后调用AsyncTask的get()方法。 这对我有用

http://developer.android.com/reference/android/os/AsyncTask.html#get(&#xFF09;

 public Result CallServer(String params) { try { MainAynscTask task = new MainAynscTask(); task.execute(params); Result aResultM = task.get(); //Add this } catch(Exception ex) { ex.printStackTrace(); } return aResultM;//Need to get back the result } ... ... 

有两种方法我可以build议 –

  1. AsyncTask onPostExecute(Result) 。 请参阅http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result&#xFF09;

  2. 发送结果作为额外的广播。

AsyncTask是一个asynchronous任务,所以将结果返回给调用者是没有意义的。 而是在onPostExecute()处理结果,如将值设置为TextView等。或者发送广播,以便其他一些侦听器可以处理结果。

以下是我如何解决这个问题:

1)创build一个接口类,为完成时执行的方法定义一个签名:

 public interface AsyncIfc { public void onComplete(); } 

2)在AsyncTask类中设置一个属性来保存委托方法:

  public AsyncIfc completionCode; 

3)在AsyncTask中从onPostExecute()触发委托:

 completionCode.onComplete(); 

4)从您的调用逻辑,将委托属性设置为匿名方法:

 task.completionCode = new AsyncIfc() { @Override public void onComplete() { // Any logic you want to happen after execution } }; 

当一个asynchronous任务被执行时,任务要经过4个步骤:

  1. onPreExecute(),在任务执行前在UI线程上调用。 此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

  2. doInBackground(Params …),在onPreExecute()完成执行后立即在后台线程上调用。 此步骤用于执行可能需要很长时间的后台计算。 asynchronous任务的parameter passing到这一步。 计算结果必须通过这个步骤返回,并返回到最后一步。 此步骤还可以使用publishProgress(Progress …)发布一个或多个进度单元。 这些值在onProgressUpdate(Progress …)步骤的UI线程上发布。

  3. onProgressUpdate(Progress …),在调用publishProgress(Progress …)后在UI线程上调用。 执行的时间是不确定的。 此方法用于在后台计算仍在执行时在用户界面中显示任何forms的进度。 例如,它可以用来animation进度条或在文本字段中显示日志。

  4. onPostExecute(Result), 在后台计算完成后在UI线程上调用。 后台计算的结果作为parameter passing到这一步。

使用处理程序

在你的活动中

  Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { String s=(String)msg.obj; tv.setText(s); } }; //result is soap object in this case. protected void onPostExecute(SoapObject result) { pd.dismiss(); if(result != null) { Message msg=new Message(); msg.obj=result.getProperty(0).toString(); mHandler.sendMessage(msg); }