ProgressDialog o ProgressBar ralentiza la aplicación que ejecuta Android 4.1

Estoy desarrollando una aplicación Android en la que utilizo un AsyncTask para obtener información de un servicio Web utilizando JSON, que luego se carga en un ListView. Hasta aquí todo funciona bien.

Utilicé un ProgressDialog que se inicia en el método onPreExecute () y se descarta en el método onPostExecute (). En el emulador que ejecuta la versión 2.3.3 android, toda esta acción toma hasta 7/8 segundos. He probado con un dispositivo real que ejecuta 2.3.6 y la aplicación tiene el mismo comportamiento.

Sin embargo, cuando uso un emulador que ejecuta la versión 4.1 android, esta acción tarda de 65 a 70 segundos. Cuando quito el ProgressDialog, la acción toma 7/8 segundos en android 2.3 y versiones 4.1. He probado todos estos escenarios muchas veces.

¿Por qué pasó esto? No tengo ningún dispositivo real con la versión 4.1 android para probarlo, así que me pregunto si es este un problema de emulador? He intentado utilizar un círculo normal de la barra del progreso, en vez del ProgressDialog, pero sucede lo mismo, apenas toma demasiado tiempo en la versión androide 4.1.

Cualquier idea sobre la cual puede ser la razón de este comportamiento extraño? S

Gracias.

Dmon y James McCracken aquí está el código de mi actividad, puede usted ayudarme en esto por favor?

public class MainActivity extends Activity { private TextView tvTitleList; private ListView lvDataSearch; private ProgressDialog dialog; private long timeStart; private String[] dataSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTitleList = (TextView) findViewById(R.id.tvTitleList); lvDataSearch = (ListView) findViewById(R.id.lvDataSearch); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public class ProcessUpdateList extends AsyncTask<Integer, String, String[]> { @Override protected void onPreExecute() { timeStart = System.currentTimeMillis(); System.out.println("pre execute"); try { tvTitleList.setText("working...."); dialog = ProgressDialog.show(MainActivity.this, "", "Loading. Please wait...", true); } catch (Exception e) { System.out.println("Error Async 1: " + e.getMessage()); } } @Override protected String[] doInBackground(Integer... paramss) { try { System.out.println("Get Data"); dataSearch = getDataSearch(); } catch (Exception e) { System.out.println("Error Async 2: " + e.getMessage()); } System.out.println("Return Data " + ((System.currentTimeMillis() - timeStart) / 1000)); return dataSearch; } @Override protected void onPostExecute(String[] values) { try { System.out.println("Post Execute Data"); tvTitleList.setText("done in " + ((System.currentTimeMillis() - timeStart) / 1000)); updateViewList(); dialog.dismiss(); } catch (Exception e) { System.out.println("Error Async 3: " + e.getMessage()); } } } public void eventUpdateList() { ProcessUpdateList process = new ProcessUpdateList(); try { process.execute(); } catch (Exception e) { System.out.println("NEW ERROR 2: " + e.getMessage()); } } public String[] getDataSearch() { try { String readTwitterFeed = readJSON2("http://search.twitter.com/search.json?q=hey"); JSONObject jsonObject = new JSONObject(readTwitterFeed); JSONArray jsonArray = new JSONArray(); jsonArray.put(jsonObject); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String json = gson.toJson(jsonObject); JSONObject jsonObject2 = new JSONObject(json); JSONObject level1 = jsonObject2.getJSONObject("nameValuePairs"); JSONObject level2 = level1.getJSONObject("results"); JSONArray level3 = level2.getJSONArray("values"); dataSearch = new String[level3.length()]; System.out.println(level3.length()+" resultados encontrados.");; for(int i=0; i<level3.length(); i++) { dataSearch[i] = level3.getJSONObject(i).getJSONObject("nameValuePairs").getString("text"); } } catch(JSONException e) { System.out.println(e.getMessage()); } return dataSearch; } public String readJSON2(String command) { JSONObject jObj = null; StringBuilder builder = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(command); try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } reader.close(); jObj = new JSONObject(builder.toString()); } else { System.out.println(MainActivity.class.toString() + " Failed to download file"); } } catch (Exception e) { return null; } return builder.toString(); } public void updateViewList() { ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, dataSearch); lvDataSearch.setAdapter(adapter); } public void clickBRefreshList(View v) { eventUpdateList(); } } 

Puedo confirmar este mismo comportamiento en el emulador solamente, probando en 4.1. En mi dispositivo real (Galaxy S3 – 4.1) esto no sucede. Además, sólo parece ocurrir con barras de progreso indeterminadas. No sé por qué sucede esto, pero tal vez usted se sentirá mejor sabiendo que esto sucede a los demás. Estoy realizando casi las mismas acciones que tú, conectándote a un servicio web, analizando una respuesta xml, luego mostrando la respuesta analizada. FYI, estoy usando un ProgressBar para el android:empty función android:empty de un ListView .

EDIT: Ejecutó algunas pruebas

He probado analizar el archivo xml y con el ProgressBar en el diseño Tengo esto:

Parse time: 94785 ms

Así que cambié esto

 <ProgressBar android:id="@id/android:empty" style="@android:style/Widget.Holo.ProgressBar" android:layout_width="wrap_content" android:layout_height="0dip" android:layout_gravity="center_horizontal|center_vertical" android:layout_weight="1"/> 

a esto

  <TextView android:id="@id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Searching..."/> 

Y obtuvo este Parse time: 2642 ms

Nota: mi ProgressBar y ListView están en LinearLayout y todo el análisis se realiza en una AsyncTask . Esto es todo en el emulador. Realmente extraño … Mi conjetura es que el emulador realmente no separa los hilos de la interfaz de usuario , por lo que el AsyncTask y ProgressBar giran están luchando por los ciclos de la CPU, mientras que en un teléfono real funciona como se pretende porque no se emula.

Edit: Por lo tanto, después de ver TaskManager en mi WinXP, el emulador comienza con 7 hilos en ejecución. AsyncTask mi aplicación, ejecutar a través de varias AsyncTask utilizando AsyncTask.THREAD_POOL_EXECUTOR y el número de hilos nunca cambia de 7 (en el Administrador de tareas) durante todo este proceso.

  • Conexión a host local: 3000 rechazado en dispositivo Android
  • Ksoap2 Android - ¿cómo especificar un espacio de nombres para las propiedades secundarias de un objeto complejo?
  • APP de Android que consume un servicio web cómo autenticar usuarios
  • Android: ¿Es una buena idea almacenar Token de autenticación en las preferencias compartidas?
  • Android Fatal señal 11 (SIGSEGV) en 0x00000040 (código = 1) Error
  • Bloquear usuarios no Android que llaman al servicio JSON
  • Envío de SQLite db al servicio web
  • Android, Ksoap, webService
  • Android - ¿Cómo manejar Webservice en XML?
  • Tutorial de servicio web de Android
  • Datos de servicio web de caché de android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.