java - onpreexecute - Desarrollo de Android: tener una AsyncTask en un archivo de clase separado
manejo de asynctask (3)
Agregue una interfaz de devolución de llamada y permita que su Activity
implemente.
public interface MyAsyncTaskCallback{
public void onAsyncTaskComplete();
}
En el postexecute:
myAsyncTaskCallback.onAsyncTaskComplete();
En el constructor de su AsyncTask
puede pasar la instancia de MyAsyncTaskCallback
(su Activity
).
He estado jugando con varios ejemplos tratando de familiarizarme con AsyncTask. Hasta ahora, todos los ejemplos que he visto han incluido AsyncTask en el método onCreate de la actividad principal. Lo que no me gusta mucho, así que quería ver lo difícil que sería separarlo en su propia clase. Hasta ahora tengo esto:
la actividad principal
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.asynctaskactivity.ShowDialogAsyncTask;
public class AsyncTaskActivity extends Activity {
Button btn_start;
ProgressBar progressBar;
TextView txt_percentage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_start = (Button) findViewById(R.id.btn_start);
progressBar = (ProgressBar) findViewById(R.id.progress);
txt_percentage= (TextView) findViewById(R.id.txt_percentage);
Log.v("onCreate","Attempt set up button OnClickListener");
btn_start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
btn_start.setEnabled(false);
new ShowDialogAsyncTask().execute();
}
});
Log.v("onCreate","Success!");
}
}
la nueva clase separada AsyncTask
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void>{
int progress_status;
@Override
protected void onPreExecute() {
// update the UI immediately after the task is executed
Log.v("onPreExecute","1");
super.onPreExecute();
Log.v("onPreExecute","2");
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPreExecute()", Toast.LENGTH_SHORT).show();
progress_status = 0;
Log.v("onPreExecute","3");
txt_percentage.setText("downloading 0%");
Log.v("onPreExecute","4");
}
@Override
protected Void doInBackground(Void... params) {
Log.v("doInBackground","1");
while(progress_status<100){
progress_status += 2;
publishProgress(progress_status);
SystemClock.sleep(300);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
txt_percentage.setText("downloading " +values[0]+"%");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPostExecute()", Toast.LENGTH_SHORT).show();
txt_percentage.setText("download complete");
btn_start.setEnabled(true);
}
}
Originalmente, esto era todo en la actividad principal, de ahí las menciones a los elementos que la asynctask debería actualizar en teoría. Obviamente en este momento está causando errores de tiempo de ejecución, lo que me hizo pensar. ¿Cómo puedo tener el archivo separado pero aún actualizar el hilo de la interfaz de usuario?
Lo siento si esta es una pregunta estúpida, bastante nueva para el desarrollo de Android y los hilos de fondo en particular.
Su mejor forma de manejar esto es a través de un Manejador. Cree una instancia en la actividad y anule el método handleMessage (). Cuando crea la clase ShowDialogAsyncTask, simplemente pase el manejador y mantenga una referencia a él. En postExecute puedes construir un mensaje y enviarlo a través del método del manejador sendMessage (). Una respuesta permeable se menciona utilizando una interfaz y un paradigma de devolución de llamada. Sin embargo, esto funcionará, existe la posibilidad de que la actividad se destruya y no esté presente cuando se ejecute el método postExecute, por lo que deberá probarlo.
¿Cómo puedo tener el archivo separado pero aún actualizar el hilo de la interfaz de usuario?
Bueno. Entonces, al principio, usted sabe que la ventaja principal de AsyncTask
agregada en Activity como clase interna es que tiene acceso directo a todos los elementos de UI y hace posible actualizaciones de UI bastante "ligeras".
Pero si decide hacer que AsyncTask se separe de Activity (que también tiene algunos beneficios, el código eq es más limpio y la lógica de la aplicación está separada de la apariencia), puede:
- Puede pasar elementos de la interfaz de usuario a través del constructor de clase
- Puedes crear varios setters
- Puede crear una interfaz que contendrá devoluciones de llamada. Mira
Android AsyncTask sending Callbacks to UI
Esto es todo lo que necesitas, supongo.