Как преобразовать ответ json из залпа, который слишком велик для выполнения в потоке пользовательского интерфейса?

Я изучал залп, и в основном все примеры похожи на следующий из официального документа< /а>:

JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub

    }
});

Насколько я понимаю, мы делаем запрос в фоновом потоке, а Volley заботится об этих деталях, и мы получаем ответ в потоке пользовательского интерфейса, когда вызывается метод onResponse, т.е.

@Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }  

Мой вопрос заключается в том, что произойдет, если ответ JSONObject от сервера нетривиален, на самом деле довольно большой, и для обновления пользовательского интерфейса нам нужно сопоставить, например, GSON для получения нужных нам полей?
Я предполагаю, что выполнение преобразования внутри onResponse является неправильным, поскольку преобразование может занять много времени, и мы будем делать это в потоке пользовательского интерфейса.
Думаю, я мог бы запустить новый поток в этот момент, но получение результатов из этого нового потока для обновления пользовательского интерфейса в потоке пользовательского интерфейса может привести к путанице.
Я считаю, что это должна быть стандартная проблема, поэтому должно быть стандартное чистое решение/подход.
Каков чистый/стандартный подход для этого преобразования?


person Jim    schedule 15.04.2015    source источник
comment
Для этого вы можете использовать AsyncTask. Он предоставляет вам обратные вызовы для обновления пользовательского интерфейса.   -  person dora    schedule 15.04.2015
comment
вам действительно следует выполнять любые сетевые вызовы в фоновом потоке.   -  person Martin    schedule 15.04.2015


Ответы (1)


Обычно у меня есть AsyncTack, который анализирует JSON асинхронно, и он принимает пользовательский Interface, который вызывающая сторона реализует в качестве параметра, имея такой метод, как:

void onResult(Object dataReturned);

После того, как объект dataReturned создается асинхронно в AsyncTask, я просто использую этот параметр AsyncFunction в качестве обратного вызова для исходного вызывающего объекта.

mCaller.onResult(data);

Я не знаю ни одного стандартного или предопределенного способа сделать это.

person C0D3LIC1OU5    schedule 15.04.2015
comment
Значит, это что-то отдельное от Volleyflow? Можно ли добавить небольшой образец в ваш ответ? - person Jim; 15.04.2015