AsyncTask: ¿dónde es mejor procesar el código que recibo?

Tengo una llamada remota que realizo y me pregunto dónde es mejor poner este código de procesamiento:

        if ( result == null )
        {       
            Toast.makeText(getApplicationContext(), "Some error message", Toast.LENGTH_LONG).show();                                

        }
        else
        if ( result.equals( "all_problems_db_error" ))
        {
        Log.d( "AllBusinessesActivity" , "result: " + result )                                      
        }
        else
        {
            // Unwrap the stuff from the JSON string                
            String problem_title = null;
            String problem_id = null;

            try
            {
                JSONArray obj = new JSONArray(result);

                if ( obj != null )
                {
                    problems.clear();

                    for ( int i = 0; i < obj.length(); i++ )
                    {
                        JSONObject o = obj.getJSONObject(i);

                        problem_title = o.getString("problem_title");
                        problem_id = o.getString("problem_id");

                        Problem p = new Problem ( );
                        p.setProblemId(problem_id);                         
                        p.setProblemName(problem_title);

                        problems.add( p );
                    }

                    adapter.notifyDataSetChanged();             

                }                                   
            }
            catch ( Exception e )
            {
           // Do something :)
            }               
        }

¿Es mejor tenerlo en onPostExecute() o al final o doInBackground() ?

Ahora lo hago en onPostExecute() pero de vez en cuando experimento algo de lentitud, y he estado leyendo que podría ser mejor hacerlo en doInBackground.

¿Podría alguien explicarme la diferencia? Y si hago esto en doInBackground(), ¿cuál es el propósito de tener el método onPostExecute?

preguntado el 12 de junio de 12 a las 19:06

2 Respuestas

La onPostExecute El método es útil cuando necesita hacer cosas en el subproceso de la interfaz de usuario. de hecho, tu no pueden hacer cualquier manipulación de la interfaz de usuario en el doInBackground método.

Así que trate de hacer todos los cálculos/descarga de datos, etc. en el doInBackground método, y solo la manipulación de su interfaz de usuario en el onPostExecute método.

Respondido el 12 de junio de 12 a las 19:06

Is it better to have it in the onPostExecute()

Dado que en su caso no hay manipulación de ningún componente de la interfaz de usuario, puede tener el código en doInBackground(). Pero como usted está mostrando un toast cuando el resultado es null Puedes comprobar el resultado en doInBackground() y si el resultado no es nulo, puede hacer el procesamiento restante en ese result en la misma función o bien puede pasar a onPostExecute() donde se puede mostrar el toast.

at the end or doInBackground() Si. Puede tener este código al final de doInBackground() ya que este método se ejecuta en un subproceso que no es de interfaz de usuario y esto definitivamente reducirá la lentitud que experimenta.

La diferencia entre ambos métodos. doInBackground() y onPostExecute() es simplemente que el primero se ejecuta en un subproceso que no es de interfaz de usuario y el último en el subproceso de interfaz de usuario.

And if I do this in the doInBackground() then what is the purpose of having the onPostExecute method

Usualmente el doInBackground() se utiliza para realizar operaciones que requieren mucho tiempo. Estas operaciones pueden incluir actividades como llamar a un servicio web o obtener imágenes de los servidores. En tales casos (como obtener imágenes de servidores), desea que las imágenes se muestren en su pantalla (que es su interfaz de usuario). Después de obtener estos recursos, pasa los datos al onPostExecute() donde puede actualizar su interfaz de usuario ya que se ejecuta en su subproceso de interfaz de usuario.

Espero que esta explicación aclare tu duda.

Respondido el 12 de junio de 12 a las 19:06

No estoy seguro, di un voto a favor. Lo mismo sucedió con una de las otras respuestas. Voté a favor los 3. - Genadinik

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.