我见过人们从 onProgressUpdate()/onPostExecute() 方法向 UI 线程发布 Toast 或类似的东西,但我想做一些可以将 JSONObject 或 JSONArray 传递回 UI 线程的事情。
在我的 AsyncTask 中,我调用了一个 Web 服务,它返回一个 JSONObject 或 JSONArray,我想将其显示在 UI 线程的页面片段中。
有谁知道我怎么能做到这一点,或者可以指出我可以向我展示的教程?
非常感谢!
如果您查看AsyncTask
文档,您会发现您实际上可以将几乎所有内容传递给onPostExecute
and 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
。您可以将侦听器传递给您的异步任务并调用它 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;
}
}