从AsyncTask获取返回的JSON

时间:2012-05-13 20:44:05

标签: android json android-asynctask return

所以我有这个扩展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();
    }
}

1 个答案:

答案 0 :(得分:4)

方法onPostExecute具有您从JSONArray方法返回的doInBackground参数。

onPostExecute在你的main(调用者)活动的线程上运行,所以除了解除该方法中的对话框之外,你还可以进一步处理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);
        }
    }
}

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