RxJava seul thread d'arrière-plan planificateur
Je suis assez nouveau dans RxJava donc c'est probablement une question stupide. Je vais vous décrire mon scénario.
J'ai un code en cours d'exécution sur le thread d'INTERFACE utilisateur qui sera mise à jour de certaines images, mais ces images ne sont pas très importants et ils consomment un peu de ressources tout en générant donc en fait je veux générer sur un seul thread (pas le thread de l'INTERFACE utilisateur, bien sûr) et de générer un par un. Je devine que le trampoline planificateur est ce que je veux mais mon problème est que si je l'utiliser, alors il fait le travail sur le thread d'INTERFACE utilisateur et je veux le faire sur un autre thread.
Évidemment, je peux écrire mon propre thread dans lequel je peux éléments de file d'attente, puis il traite les une par une, mais j'ai pensé que peut-être RxJava aurait une solution simple pour moi?
Mon code ressemble à ceci:
Observable<Bitmap> getImage = Observable.create(new Observable.OnSubscribe<Bitmap>() {
@Override public void call(Subscriber<? super Bitmap> subscriber) {
Log.w(TAG,"On ui thread? "+ UIUtils.isRunningOnUIThread());
subscriber.onNext(doComplexTaskToGetImage());
subscriber.onCompleted();
}
});
getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1<Bitmap>() {
@Override public void call(Bitmap bitmap) {
codeToSetTheBitmap(bitmap);
}
});
Mon journal qui dit que "Sur le thread de l'interface utilisateur?" a toujours vrai. Alors, comment puis-je faire le code et toutes les tentatives ultérieures de faire la même chose exécuter sur un seul thread (pas le thread d'interface utilisateur) dans l'ordre, sans écrit un tas de code de la file d'attente de ce que le travail?
Edit:
Je crois que cela peut maintenant être réalisé à l'aide de Schedulers.single()
ou si vous voulez votre propre vous pouvez utiliser new SingleScheduler()
. Je suis encore en test, mais je pense que c'est ce que je voulais quand j'ai posté cette.
Je suis déjà en utilisant RxAndroid et mon code montre que je suis en utilisant
subscribeOn
. Je ne sais pas ce qu'à passer à subscribeOn
à faire ce que je veux.Vous devez vous abonner à un thread d'arrière-plan
Scheduler
(la Schedulers
classe contient statique de l'usine de méthodes pour la création d'eux). Ensuite, vous avez besoin d'observer, sur un thread principal Scheduler
, ce qui peut être fait l'acquisition en RxAndroid via le AndroidSchedulers.mainThread()
méthode.Je le conçois, mais qui
Scheduler
va me donner un thread d'arrière-plan qui va continuer à réutilisée de travail tout comme le trampoline
planificateur?Vous pouvez créer un
ThreadPoolExecuter
avec une piscine de taille 1 (Executors.newSingleThreadExecutor()
), puis l'utiliser pour générer les planificateurs via le Schedulers.from()
méthode. Alternativement, vous pouvez créer un personnalisé Thread
avec un Looper
en cours d'exécution (par exemple,HandlerThread
), et passer un Handler
cours d'exécution sur la Looper
à la AndroidSchedulers.handlerThread()
méthode pour obtenir un Scheduler
qui va fonctionner sur ce thread.OriginalL'auteur casolorz | 2015-04-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer un seul filetage réutilisable pour créer un
Scheduler
pour laObservable
dans l'une des façons suivantes:ThreadPoolExecuter
avec une piscine de taille 1 (Executors.newSingleThreadExecutor()
est une pratique statique usine méthode pour faire cela), puis l'utiliser pour générer les planificateurs via leSchedulers.from()
méthode.Scheduler
de mise en œuvre qui utilise unHandler
pour planifier les actions, et peut donc être utilisé avec n'importe quelThread
qui a unLooper
cours d'exécution en passant,Handler
à laAndroidSchedulers.handlerThread()
méthode de fabrique.Notez que vous aurez besoin d'observer, sur un thread principal
Scheduler
si vous êtes en interaction avec l'INTERFACE utilisateur à l'issue de ces tâches.Schedulers.singleThread()
méthode dans rxjava, tout comme sonnewThread()
.RxJava 2 a un nouveau
Schedulers.single()
.OriginalL'auteur
Dans RxJava 2 vous pouvez utiliser
Schedulers.single()
qui:Veuillez voir la documentation pour plus de détails.
Je ne vois pas disponible dans RxJava 1 Les planificateurs de la documentation.
bien sûr
single()
renvoie toujours le même thread, puisque vous voulez que le travail soit de manière séquentielle (c'est le point de l'ensemble de celle-ci). Si vous voulez deux indépendants single-threaded planificateurs puis utiliser lesSchedulers.from(Executor executor)
, comme il est expliqué sur l'autre réponse.OriginalL'auteur