uso studio run manejo implement hilos curso create asynctask android android-asynctask android-handler android-json

android - studio - manejo de asynctask



Cómo actualizar ui desde asynctask (3)

Lo primero es usar poslayed () no ejecutará tu código en repetición. Si deseas ejecutar código en patrones repetitivos usa este código. Esto se ejecutará después de cada 5 segundos

ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); /*This schedules a runnable task every second*/ scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { public void run() { runOnUiThread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub new GetContacts().execute(); } }); } }, 0, 5, TimeUnit.SECONDS);

El código que está siguiendo crea una nueva instancia de SimpleAdapter en postExecute () cada vez, por lo que verá los mismos datos una y otra vez. Por lo tanto, si desea actualizar su adaptador, cree la instancia de SimpleAdapter como miembro de clase y reemplace postExecute () por este

@Override protected void onPostExecute(Void result) { super.onPostExecute(result); // Dismiss the progress dialog if (pDialog.isShowing()) pDialog.dismiss(); /** * Updating parsed JSON data into ListView * */ if(adapter == null) { adapter = new SimpleAdapter( MainActivity.this, contactList, R.layout.list_item, new String[] { TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE }, new int[] { R.id.name, R.id.email, R.id.mobile }); setListAdapter(adapter); } else { adapter.notifyDataSetChanged(); } }

Ahora esto actualizará el adaptador pero agregará el mismo contacto

He visto muchos ejemplos de cómo hacer esto, pero puedo averiguar cómo implementarlo en mi código.

Estoy usando este código .
He actualizado la url, por lo que recibirá una json con datos dinámicos. Lo que intento hacer es actualizar automáticamente la lista cada 30 segundos con este código.

Handler handler = new Handler(); Runnable refresh = new Runnable() { public void run() { new GetContacts().execute(); handler.postDelayed(refresh, 30000); } };

Se actualizó y llama a la url y obtiene los datos, pero la IU no se actualiza.

Gracias por cualquier pista que me ayude en la dirección correcta.

http://www.androidhive.info/2012/01/android-json-parsing-tutorial/


Tienes tres métodos protegidos en una AsyncTask que pueden interactuar con la UI.

  • onPreExecute()
    • se ejecuta antes de doInBackground()
  • onPostExecute()
    • se ejecuta después de completar doInBackground()
  • onProgressUpdate()
    • esto solo se ejecuta cuando doInBackground() llama con publishProgress()

Si en su caso la tarea se ejecuta durante un tiempo superior a los 30 segundos que desea actualizar, deseará utilizar onProgressUpdate() y publishProgress() . De onPostExecute() contrario onPostExecute() debería hacer el truco.

Consulte la documentación oficial sobre cómo implementarlo.


Puede usar AsycTask y actualizar la list ui en la tarea finalizada en onPostExecute .

new AsyncTask<String, String, String>() { /** * Before starting background do some work. * */ @Override protected void onPreExecute() { } @Override protected String doInBackground(String... params) { // TODO fetch url data do bg process. return null; } /** * Update list ui after process finished. */ protected void onPostExecute(String result) { // NO NEED to use activity.runOnUiThread(), code execute here under UI thread. // Updating parsed JSON data into ListView final List data = new Gson().fromJson(result); // updating listview ((ListActivity) activity).updateUI(data); } }; }

Actualización No es necesario utilizar runOnUiThread dentro onPostExecute , porque ya está llamado y su cuerpo se ejecuta en UIThread .