从AsyncTask返回JSON数组
问题描述:
我有一个获取JSON数组的AsyncTask。我怎么会返回JSON数组是这样的:从AsyncTask返回JSON数组
JSONArray channels = new Json().execute(foo, bar);package com.example.tvrplayer;
ECLIPS告诉我,我不能做到这一点,它应该是:
AsyncTask<Object, Integer, JSONArray> channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET");
JSON的异步类:
public class Json extends AsyncTask<Object, Integer, JSONArray> {
Json(){
super();
}
@Override
protected JSONArray doInBackground(Object... params) {
// Log.i("JSON",url);
String url = (String) params[0];
String method = (String) params[1];
InputStream is = null;
String result = "";
JSONArray jsonObject = null;
// HTTP
try {
HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
if (method == "GET") {
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} else if (method == "POST") {
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
} catch(Exception e) {
Log.e("JSON - 1 -", e.toString());
return null;
}
// Read response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
// result = result.substring(1,result.length()-1);
// Log.d("JSON result",result);
} catch(Exception e) {
Log.e("JSON - 2 -", e.toString());
return null;
}
// Convert string to object
try {
jsonObject = new JSONArray(result);
} catch(JSONException e) {
Log.e("JSON - 3 -", e.toString());
return null;
}
return jsonObject;
}
@Override
protected void onPostExecute(JSONArray result)
{
super.onPostExecute(result);
final Message msg = new Message();
msg.obj = result;
}
}
这是我试图完成什么:
JSONArray channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET");
try {
for (int i=0; i < channels.length(); i++) {
JSONObject channel_data = channels.getJSONObject(i);
String channelID = channel_data.getString("ChannelID").toLowerCase();
JSONArray json = new Json().execute("http://192.168.2.136:8080/rest/program/"+ linkid +"/"+ username +"/" + channelID, "GET");
答
您从AsyncTask
开始并不是return
。你指示AsyncTask
在一天之前给它做些什么,但是不会有任何return
给你。这就是为什么它被称为“异步”:你不会等待它,它不会等待你。
例如,借此代码与SyncTask
:
result = SyncTask();
label.setText(result);
这意味着setText()
线将不被执行,直到SyncTask()
完成并产生一result
。它是同步的。相反,与异步,你做:
new AsyncTask() {
@Override
void onPostExecute(result) {
label.setText(result)
}
}.start()
这带来了一个全新的world of trouble。我建议你看看Loaders
,它的工作方式相似,但提供了更强的抽象。
此外,我告诉你这一事实意味着有很多事情你不明白。你可能想要谷歌相关的文档,教程或文章。
答
从Asynctask执行(Runnable runnable)将返回void。
将您的结果onPostExecute(),像这样:
渠道=结果; DoSomething的(渠道)
答
你不必从的AsyncTask返回任何
@Override
protected void onPostExecute(JSONArray result)
{
super.onPostExecute(result);
channels = result
//<here you can use channels to integrate with other code>
}
这里的通道将被宣布为类变量
JSONArray channels;
我不能让你......你是什么想要... – Pragnani 2013-02-21 15:58:44
asynctask,顾名思义,是异步的。这意味着它不能立即返回结果(这将是同步的,请参阅?)。你必须等到onPostExecute才能收到一些东西。 execute()不打算返回任何东西。 – njzk2 2013-02-21 15:58:58
我想要返回JSON数组,以便通道= jsonObject – Harry 2013-02-21 15:59:21