我有一个获取 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
返回
。您在结束之前指示 AsyncTask 执行某些操作,但它不会向您返回任何内容。这就是为什么它被称为“异步”:你不等待它,它也不等你。
例如,将此代码与 SyncTask
结合使用:
result = SyncTask();
label.setText(result);
这意味着 setText()
行不会执行,直到 SyncTask()
完成并产生 结果
。这是同步的。相反,使用异步,您可以:
new AsyncTask() {
@Override
void onPostExecute(result) {
label.setText(result)
}
}.start()
这带来了一个全新的 world of trouble 。我建议您看一下 Loaders
,它的工作原理类似,但提供了更强大的抽象。
此外,我告诉你这意味着有很多事情你不明白。您可能需要通过 Google 搜索相关文档、教程或文章。
关于android - 从 AsyncTask 返回 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006548/