我见过人们从onProgressUpdate()/ onPostExecute()方法向UI线程发布Toast或类似的东西,但是我想做一些我可以将JSONObject或JSONArray传回给UI线程。
在我的AsyncTask中,我正在调用一个Web服务,它返回一个JSONObject或JSONArray,我希望将其显示在UI线程的页面片段中。
有谁知道我该怎么做,或者可以指出一个可以告诉我的教程?
非常感谢!
答案 0 :(得分:1)
如果您查看AsyncTask
文档,您会看到实际上可以将所有内容传递给onPostExecute
和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
}
}
以下示例可以更改为任何其他参数,其中泛型类型的顺序如下:
doInBackground
收到的类型。publishProgress
并由onProgressUpdate
收到的类型。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;
}
}