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.
- ¿Es posible ejecutar un servidor Tomcat y algunas aplicaciones web en un dispositivo Android? (es decir, un comprimido)
- Recomendaciones para el formato / protocolo de .NET Web Service para Android, iPhone, etc.
- Necesidad de transferir el archivo .apk mediante webservice
- ¿Cómo conectarse a una base de datos remota con Webservices?
- Error de java.lang.outofmemory (servicios web) en android
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(); } }
- Android Obtener archivo pdf como resultado de httppost
- ¿Cómo conectar el teléfono de android a un servicio de la tela funcionado en el servidor local?
- Error: NullPointerAccess: La variable "" sólo puede ser null en esta ubicación
- Cliente Android para servicio web REST con seguridad básica
- Cómo enviar una cadena json a un servicio .NET REST de java?
- SOAP xml a cambio - Android
- Cómo utilizar la sesión para trabajar entre php webservices y android
- Solicitudes seguras de servicio web
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.
- La pantalla se ha vuelto boca abajo
- Automatización de pruebas de iPhone – herramientas de referencia?