7

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

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?
       }
4

4 回答 4

15

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

http://developer.android.com/reference/android/os/AsyncTask.html#get()

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

} 
...
...
于 2013-11-21T11:13:38.793 回答
3

我可以建议两种方法-

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

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

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

于 2013-04-01T07:52:23.777 回答
1

这是我解决这个问题的方法:

1)创建一个接口类,该类定义一个方法的签名以在完成时执行:

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
    }
};
于 2013-10-16T04:18:10.960 回答
0

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

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

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

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

  4. onPostExecute(Result),在后台计算完成后在 UI 线程上调用。后台计算的结果作为参数传递给该步骤。

使用处理程序

在你的活动中

    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);
    }
于 2013-04-01T07:57:01.003 回答