【问题标题】:Get returned JSON from AsyncTask从 AsyncTask 获取返回的 JSON
【发布时间】:2012-05-21 10:47:55
【问题描述】:

所以我有这个扩展 AsyncTask 的加载器类。然后我做new loader().execute(); 但我想使用我的加载器类返回JSONArray 响应 我该怎么做?因为我在几个不同的地方都需要它?还是我应该将我的代码移动到 onPostExecute 并从那里做所有事情?

public class loader extends AsyncTask<String, Integer, JSONArray> {

    ProgressDialog dialog;

    protected void onPreExecute() {

        dialog = ProgressDialog.show(ChallengeList.this, "", "Laddar...");
        dialog.setCancelable(true);
    }

    @Override
    protected JSONArray doInBackground(String... params) {


    JSONArray response = null;
    HttpClient client = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(listURL);

    try {

        HttpResponse resp = client.execute(httppost);
        StatusLine statusLine = resp.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        Log.i("Statuscode", "statusCode"+statusCode);
        if (statusCode == 200) {
            final JSONObject json = new JSONObject();

            json.put("userID", prefs.id());

            response = SendHttp.parseHttp(listURL, json);

        }
    } catch (JSONException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    } 

        return response;
    }
    protected void onPostExecute(JSONArray result) {
        dialog.dismiss();
    }
}

【问题讨论】:

    标签: android json android-asynctask return


    【解决方案1】:

    下载内容网页后,您可以在 onPostExecute 方法中使用以下代码:

    protected void onPostExecute(String s) { super.onPostExecute(s);

            try {
                JSONObject jsonObject = new JSONObject(s);
    
                String weatherInfo = jsonObject.getString("weather");
    
                Log.i("Weather content", weatherInfo);
    
                JSONArray arr = new JSONArray(weatherInfo);
    
                for (int i=0; i < arr.length(); i++) {
                    JSONObject jsonPart = arr.getJSONObject(i);
    
                    Log.i("main",jsonPart.getString("main"));
                    Log.i("description",jsonPart.getString("description"));
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      onPostExecute 方法的参数是您从doInBackground 方法返回的JSONArray

      onPostExecute 在您的主(调用者)活动的线程上运行,因此除了在该方法中关闭对话框之外,您还可以进一步处理 result 数组,将其安全地传递给其他方法,等等:

      @Override
      protected void onPostExecute(JSONArray result)
      {
          super.onPostExecute(result);
          final Message msg = new Message();
          msg.obj = result;
          if (youWantToUseHandler)
              handler.dispatchMessage(msg);
          else
              writeJSONArray(result);
      }
      

      handler:

      final Handler handler = new Handler()
      {
          public void handleMessage(Message msg) 
          {
              final JSONArray result = (JSONArray)msg.obj;
              writeJSONArray(result);
          };
      };
      

      其他方法:

      private void writeJSONArray(final JSONArray result)
      {
          for (int i = 0; i < result.length(); i++)
          {
              try
              {
                  Log.d("SAMPLE", result.get(i).toString());
              }
              catch (JSONException e)
              {
                  Log.e("SAMPLE", "error getting result " + i, e);
              }
          }
      }
      

      Since onPostExecute "在doInBackground之后在UI线程上运行。指定的结果是doInBackground返回的值,如果任务被取消或发生异常,则为null。" ~API 文档 您可以调用您在类中声明的任何方法,并将此数组作为参数传递给它。

      【讨论】:

      • 但是没有办法在onPostExecute之外使用它吗?就像在我完成 new loader().execute(); 之后获取 JSONArray 一样然后在我的主代码中使用它?
      • 例如,您可以将其传递给处理程序,然后从那里使用它。在你的主应用程序中声明一个处理程序,并从 onPostExecute 调用它。
      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多