ACTUALIZACIÓN - 2016
La mejor alternativa es utilizar RxAndroid
(fijaciones específicas para RxJava
) para el P
de MVP
hacerse cargo fo datos.
Comience por regresar Observable
de su método existente.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Use este Observable como este:
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Sé que llego un poco tarde pero aquí va. Básicamente, Android funciona en dos tipos de subprocesos, a saber, subproceso de interfaz de usuario y subproceso de fondo . De acuerdo con la documentación de Android:
No acceda al kit de herramientas de la interfaz de usuario de Android desde fuera del hilo de la interfaz de usuario para solucionar este problema, Android ofrece varias formas de acceder al hilo de la interfaz de usuario desde otros hilos. Aquí hay una lista de métodos que pueden ayudar:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Ahora hay varios métodos para resolver este problema.
Lo explicaré por ejemplo de código:
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Clase utilizada para ejecutar un bucle de mensaje para un hilo. Los subprocesos por defecto no tienen un bucle de mensajes asociado con ellos; para crear uno, llame a prepare () en el hilo que va a ejecutar el bucle, y luego bucle () para que procese los mensajes hasta que se detenga.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
AsyncTask
AsyncTask le permite realizar trabajos asincrónicos en su interfaz de usuario. Realiza las operaciones de bloqueo en un subproceso de trabajo y luego publica los resultados en el subproceso de la interfaz de usuario, sin necesidad de que usted mismo maneje los subprocesos y / o controladores.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Manipulador
Un controlador le permite enviar y procesar mensajes y objetos ejecutables asociados con MessageQueue de un hilo.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
, no requiererunOnUiThread()
oContext
variable, ¡toda la rutina se ha ido! solo invoqueToaster.toast(R.string.my_msg);
aquí es el ejemplo: github.com/shamanland/xdroid-toaster-example