AGGIORNAMENTO - 2016
La migliore alternativa è quella di utilizzare RxAndroid
(attacchi specifici per RxJava
) per l' P
in MVP
carica di prendere fo dati.
Inizia tornando Observable
dal tuo metodo esistente.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Usa questo osservabile in questo modo -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
So di essere un po 'in ritardo, ma qui va. Android funziona fondamentalmente su due tipi di thread, ovvero il thread dell'interfaccia utente e il thread in background . Secondo la documentazione Android -
Non accedere al toolkit dell'interfaccia utente Android dall'esterno del thread dell'interfaccia utente per risolvere questo problema, Android offre diversi modi per accedere al thread dell'interfaccia utente da altri thread. Ecco un elenco di metodi che possono aiutare:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Ora ci sono vari metodi per risolvere questo problema.
Lo spiegherò per esempio di codice:
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
Classe utilizzata per eseguire un ciclo di messaggi per un thread. Ai thread di default non è associato un loop di messaggi; per crearne uno, chiama prepar () nel thread che deve eseguire il loop, quindi loop () per farlo elaborare i messaggi fino a quando il loop non viene interrotto.
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 ti consente di eseguire lavori asincroni sulla tua interfaccia utente. Esegue le operazioni di blocco in un thread di lavoro e quindi pubblica i risultati sul thread dell'interfaccia utente, senza la necessità di gestire autonomamente thread e / o gestori.
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
}
}
handler
Un gestore consente di inviare ed elaborare oggetti Message e Runnable associati a MessageQueue di un thread.
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'
, non richiederunOnUiThread()
oContext
variabile, tutta la routine è andata! basta invocareToaster.toast(R.string.my_msg);
qui l'esempio: github.com/shamanland/xdroid-toaster-example