MISE À JOUR - 2016
La meilleure alternative consiste à utiliser RxAndroid
(des liaisons spécifiques pour RxJava
) pour que l' P
in MVP
se charge des données.
Commencez par revenir Observable
de votre méthode existante.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Utilisez cet observable comme ceci -
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
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Je sais que je suis un peu en retard mais c'est parti. Android fonctionne essentiellement sur deux types de threads, à savoir le thread d'interface utilisateur et le thread d'arrière - plan . Selon la documentation Android -
N'accédez pas au kit d'outils Android UI depuis l'extérieur du thread d'interface utilisateur pour résoudre ce problème, Android propose plusieurs façons d'accéder au thread d'interface utilisateur à partir d'autres threads. Voici une liste de méthodes qui peuvent vous aider:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Il existe maintenant différentes méthodes pour résoudre ce problème.
Je vais l'expliquer par exemple de code:
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 utilisée pour exécuter une boucle de message pour un thread. Les threads par défaut n'ont pas de boucle de message qui leur est associée; pour en créer un, appelez prepare () dans le thread qui doit exécuter la boucle, puis loop () pour qu'il traite les messages jusqu'à ce que la boucle soit arrêtée.
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 vous permet d'effectuer un travail asynchrone sur votre interface utilisateur. Il effectue les opérations de blocage dans un thread de travail, puis publie les résultats sur le thread d'interface utilisateur, sans vous obliger à gérer vous-même les threads et / ou les gestionnaires.
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
}
}
Gestionnaire
Un gestionnaire vous permet d'envoyer et de traiter des objets Message et Runnable associés à MessageQueue d'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'
, elle n'a pas besoinrunOnUiThread()
ouContext
variable, toute routine est partie! juste invoquerToaster.toast(R.string.my_msg);
voici l'exemple: github.com/shamanland/xdroid-toaster-example