将JSONObject / JSONArray从AsyncTask传递到UI线程

时间:2012-11-22 07:00:11

标签: java android json

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

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

有谁知道我该怎么做,或者可以指出一个可以告诉我的教程?

非常感谢!

2 个答案:

答案 0 :(得分:1)

如果您查看AsyncTask文档,您会看到实际上可以将所有内容传递给onPostExecuteonProgressUpdate

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. 第三个是doInBackground的返回类型,由onPostExecute收到。

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

}