android - 从 AsyncTask 返回 JSON 数组

标签 android android-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返回。您在结束之前指示 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/

相关文章:

java - Android:写入文件不起作用

android - 所有屏幕中的自定义 toast 消息?

java - 如何从 AsyncTask 获取位图并将其设置为我的图像

java - 无法通过 AsyncTask 和 inputStreamReader 获取 HTML 代码

android - 在服务中使用 AsyncTask

android - mayInterruptIfRunning取消ASyncTask的用法-函数调用顺序-

android - 布局检查器 - 如何查找文本元素的当前字体

android - 我想从我们开发的移动应用程序的 11 字节数据中识别 BLE 车轮和曲柄传感器数据

android - 在 Activity 之间传递对象的数组列表

java - android 中的 Jsoup java.io.EOFException