1

我见过人们从 onProgressUpdate()/onPostExecute() 方法向 UI 线程发布 Toast 或类似的东西,但我想做一些可以将 JSONObject 或 JSONArray 传递回 UI 线程的事情。

在我的 AsyncTask 中,我调用了一个 Web 服务,它返回一个 JSONObject 或 JSONArray,我想将其显示在 UI 线程的页面片段中。

有谁知道我怎么能做到这一点,或者可以指出我可以向我展示的教程?

非常感谢!

4

2 回答 2

1

如果您查看AsyncTask文档,您会发现您实际上可以将几乎所有内容传递给onPostExecuteand onProgressUpdate

private class JsonAsyncTask extends AsyncTask<URL, String, JSONObject> {

    protected JSONObject doInBackground(URL... urls) {
         // usrls to connect to server
         publishProgress(/* some string you got, for example */
         // ...
         return /* a json object you created from data received */;
     }

     protected void onProgressUpdate(String ... progress) {
         // parse the string and display it
     }

     protected void onPostExecute(JSONObject result) {
         // display results from the JSONObject
     }
 }

下面的示例可以更改为任何其他参数,其中泛型类型的排序如下:

  1. 第一个是接收的类型doInBackground
  2. 第二个是传递给publishProgress和接收的类型onProgressUpdate
  3. 第三个是 fromdoInBackground和接收的返回类型onPostExecute
于 2012-11-22T07:06:30.123 回答
0

您可以将侦听器传递给您的异步任务并调用它 onPostExecute

public interface MyListener {
  public abstract void onResult(Object json);
}

MyTask mt = new MyTask(new MyListener() {
  public void onResult(Object json) {
    //catch your object here
  }
});
mt.execute();

class MyTask extends AsyncTask<Void, Void, Object> {

  private MyListener listener;

  public MyTask(MyListener listener) {
    this.listener = listener;
  }

  protected void onPostExecute(Object result) {
    if (listener != null) {
      listener.onResult(result);
    }
  }

  protected void doInBackground(Void... params) {
    Object result = new Object();
    //your task
    return result;
  }

}
于 2012-11-22T07:07:19.253 回答