Вопрос по json, android, android-asynctask – Получить возвращенный JSON из AsyncTask

3

Итак, у меня есть класс загрузчика, который расширяет AsyncTask. Тогда я делаюnew loader().execute(); но я хочу использоватьJSONArray response который мой класс погрузчика Возвращает как я это сделал? Потому что мне это нужно в нескольких разных местах? Или мне просто переместить мой код в onPostExecute и делать все оттуда?

<code>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();
    }
}
</code>

Ваш Ответ

2   ответа
4

onPostExecute имеет в качестве параметраJSONArray ты вернулся изdoInBackground метод.

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);
}

thehandler:

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. Указанным результатом является значение, возвращаемое doInBackground или null, если задача была отменена или возникла исключительная ситуация." ~ Документы API Вы можете вызвать любой метод, который вы объявили в своем классе, и передать этот массив в качестве параметра.

Хорошо, спасибо! simtaxman
Не за что, рад, что заставил это работать rekaszeru
Но разве нет способа использовать его вне onPostExecute? Как получить JSONArray после того, как я сделал новый loader (). Execute (); а потом просто использовать его в моем основном коде? simtaxman
Вы можете передать его обработчику, например, и использовать его оттуда. объявите обработчик в вашем основном приложении и вызовите его из onPostExecute. rekaszeru
пожалуйста, посмотрите мое обновление для образцов. rekaszeru
0

методе 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();
        }

    }

Похожие вопросы