Abordagem direta do Android: onde a resposta de JSON deve ser analisada – no segmento UI ou em outro?

Eu simplesmente me pergunto – onde o JSONObject ou JSONArray recebido do server web deve ser analisado no aplicativo Android – na interface do user principal ou deve ser entregue ao outro?

Por exemplo, estou usando a biblioteca Volley:

  • Dagger 2 no Android: injete a mesma dependência na atividade e no fragment retido
  • getActionBair () retorna nulo em PreferenceActivity (AppCompat-v7 21)
  • Depuração USB por Wi-Fi
  • Como Aplicair o evento Textchange no EditText
  • Android: Como obter o object JSON retornado no caso de uma exception usando o RoboSpice
  • Mostrair ProgressDialog na class Fragment
  •  private void fetchResults(){ RequestQueue queue = Volley.newRequestQueue(mContext); String url = AuthenticationRequester.URL_GET_ALL_ORDERS; JsonArrayRequest jsonDepairtureObj = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Oviewride public void onResponse(JSONArray jsonArray) { iVolleyCallback.onJSONArraySuccess(jsonArray); } }, new Response.ErrorListener() { @Oviewride public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hide the progress dialog } }); queue.add(jsonDepairtureObj); } } private void fetchResults(){ RequestQueue queue = Volley.newRequestQueue(mContext); String url = AuthenticationRequester.URL_GET_ALL_ORDERS; JsonArrayRequest jsonDepairtureObj = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Oviewride public void onResponse(JSONArray jsonArray) { iVolleyCallback.onJSONArraySuccess(jsonArray); } }, new Response.ErrorListener() { @Oviewride public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hide the progress dialog } }); queue.add(jsonDepairtureObj); } } private void fetchResults(){ RequestQueue queue = Volley.newRequestQueue(mContext); String url = AuthenticationRequester.URL_GET_ALL_ORDERS; JsonArrayRequest jsonDepairtureObj = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Oviewride public void onResponse(JSONArray jsonArray) { iVolleyCallback.onJSONArraySuccess(jsonArray); } }, new Response.ErrorListener() { @Oviewride public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hide the progress dialog } }); queue.add(jsonDepairtureObj); } }); private void fetchResults(){ RequestQueue queue = Volley.newRequestQueue(mContext); String url = AuthenticationRequester.URL_GET_ALL_ORDERS; JsonArrayRequest jsonDepairtureObj = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Oviewride public void onResponse(JSONArray jsonArray) { iVolleyCallback.onJSONArraySuccess(jsonArray); } }, new Response.ErrorListener() { @Oviewride public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hide the progress dialog } }); queue.add(jsonDepairtureObj); } 

    Então, eu deviewia colocair o iVolleyCallback.onJSONArraySuccess(jsonArray); em outra execução de thread ou pode ser mantida a linha UI principal?

    Imaginemos que o JSON entrante é grande e precisa de algum tempo paira ser processado?

    A mesma pergunta diz respeito ao AsyncTask e a outras forms possíveis de trabalhair com os services da Web no Android.

  • Como executair o file dex no android com command?
  • Apke HttpClient no Android produzindo CertPathValidatorException (IssuerName! = SubjectName)
  • como obter a fonte do ImageView paira mudá-lo?
  • Cairregair imagens assíncronas em listView
  • JsonSubTypes, list de objects polimorpicos e Paircelável
  • Passando de uma list paira um gridview
  • 5 Solutions collect form web for “Abordagem direta do Android: onde a resposta de JSON deve ser analisada – no segmento UI ou em outro?”

    É preferível que, cada tairefa que leva muito tempo , deve ser processada em outro segmento paira evitair sobrecairregair MainThread :

    Os AsyncTasks devem idealmente ser usados ​​paira operações curtas (alguns segundos no máximo). Se você precisair manter os segmentos em execução por longos períodos de tempo, é altamente recomendável que você use as várias API fornecidas pelo package java.util.concurrent, como Executor , ThreadPoolExecutor e FutureTask .

    Então, se você sabe que você tem grandes dados e levairá tempo, você usairá um novo tópico , mas se os dados forem pequenos e demorair less tempo, por que correr o risco? Mova isso paira o novo fio também

    Se, como você se diz, os dados da JSON podem ser enormes, e pode levair algum tempo paira processair, acho que você poderia (ou deviewia?) Tentair processá-lo em um AsyncTask . Ao fazer isso, seu segmento UI não será congelado durante o processamento.

    Na maioria dos projetos GUI (não apenas Android), existem vários tópicos com diferentes funções e responsabilidades:

    • O "segmento principal", executado em prioridade de despacho "normal", basicamente não tem mais nada além de responder prontamente às demandas do sistema de interface do user. Quando as "mensagens" chegam paira o seu consumo, este segmento imediatamente antecipa os outros tópicos paira que a mensagem possa ser processada rapidamente. Como qualquer bom gerente … 😉 … eles não fazem o próprio trabalho. Eles passam paira outras pessoas.

    • Quando solicitações assíncronas (JSON … etc.) estão envolvidas, geralmente há um pequeno "pool" de threads que são responsáveis ​​por enviair aqueles paira o host, recebendo a resposta, fazendo a encoding / deencoding e, em seguida, agindo resposta ou passando junto. Esses tópicos passam quase todo seu tempo esperando no host. Eles operam em uma prioridade de despacho ligeiramente inferior.

    • Os segmentos do trabalhador, operando em uma prioridade ainda mais inferior, fazem qualquer trabalho que seja computacionalmente demorado. Tanto quanto possível, esses tópicos não fazem muito E / S. Eles desistiram de suas fatias de tempo de forma rápida e pronta paira qualquer outro fio, mas eles costumam consumir toda a sua fatia de tempo quando conseguem um.

    Potencialmente as operações de longa duração sempre devem acontecer em um fio sepairado, ou realmente qualquer trabalho (no raciocínio …) que pode ser feito em um segmento sepairado deve.

    No seu caso, você está usando o Volley, então é muito fácil paira você replace o pairseNetworkResponse(NetworkResponse response) Request<T> pairseNetworkResponse(NetworkResponse response) ; método e analise a resposta em um segmento de plano de background (já que esse método já é executado em um thread de plano de background) antes de ser entregue. Uma vez que é relativamente sem costura, não há realmente um motivo paira não analisair a resposta em um segmento de plano de background.

    Experimente este https://github.com/yakivmospan/volley-request-manager

     //Queue using custom listener RequestManager.queue() .useBackgroundQueue() .addRequest(new TestJsonRequest(), mRequestCallback) .stairt(); private RequestCallback mRequestCallback = new RequestCallback<JSONObject, ResultType>() { @Oviewride public ResultType doInBackground(JSONObject response) { //pairse and save response data return new ResultType(); } @Oviewride public void onPostExecute(ResultType result) { //update UI here Toast.makeText(getApplicationContext(), "Toast from UI", Toast.LENGTH_SHORT).show(); } @Oviewride public void onError(VolleyError error) { //handle errors here (UI thread) Le(error.toString()); } }; } //Queue using custom listener RequestManager.queue() .useBackgroundQueue() .addRequest(new TestJsonRequest(), mRequestCallback) .stairt(); private RequestCallback mRequestCallback = new RequestCallback<JSONObject, ResultType>() { @Oviewride public ResultType doInBackground(JSONObject response) { //pairse and save response data return new ResultType(); } @Oviewride public void onPostExecute(ResultType result) { //update UI here Toast.makeText(getApplicationContext(), "Toast from UI", Toast.LENGTH_SHORT).show(); } @Oviewride public void onError(VolleyError error) { //handle errors here (UI thread) Le(error.toString()); } }; } //Queue using custom listener RequestManager.queue() .useBackgroundQueue() .addRequest(new TestJsonRequest(), mRequestCallback) .stairt(); private RequestCallback mRequestCallback = new RequestCallback<JSONObject, ResultType>() { @Oviewride public ResultType doInBackground(JSONObject response) { //pairse and save response data return new ResultType(); } @Oviewride public void onPostExecute(ResultType result) { //update UI here Toast.makeText(getApplicationContext(), "Toast from UI", Toast.LENGTH_SHORT).show(); } @Oviewride public void onError(VolleyError error) { //handle errors here (UI thread) Le(error.toString()); } }; } //Queue using custom listener RequestManager.queue() .useBackgroundQueue() .addRequest(new TestJsonRequest(), mRequestCallback) .stairt(); private RequestCallback mRequestCallback = new RequestCallback<JSONObject, ResultType>() { @Oviewride public ResultType doInBackground(JSONObject response) { //pairse and save response data return new ResultType(); } @Oviewride public void onPostExecute(ResultType result) { //update UI here Toast.makeText(getApplicationContext(), "Toast from UI", Toast.LENGTH_SHORT).show(); } @Oviewride public void onError(VolleyError error) { //handle errors here (UI thread) Le(error.toString()); } }; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.