2015-04-17 9 views
14

Sono abbastanza nuovo per RxJava, quindi questa è probabilmente una domanda stupida. Sto per descrivere il mio scenario.Utilità di pianificazione a sfondo singolo RxJava

Ho del codice in esecuzione sul thread dell'interfaccia utente che aggiornerà alcune immagini ma quelle immagini non sono molto importanti e consumano un po 'di risorse durante la generazione, quindi voglio generarle su un singolo thread (non sul thread dell'interfaccia utente ovviamente) e generarli uno per uno. Immagino che lo scheduler del trampolino sia quello che voglio, ma il mio problema è che se lo uso, funziona sul thread dell'interfaccia utente e voglio farlo su un altro thread.

Ovviamente posso scrivere il mio thread in cui posso mettere in coda gli oggetti e poi li elabora uno per uno, ma ho pensato che forse RxJava avrebbe avuto una soluzione semplice per me?

mio codice attuale si presenta così: "Sul filo ui"

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); 
    } 
}); 

mio registro che dice è sempre vero Quindi, come faccio a fare quel codice e tutti i successivi tentativi di eseguire la stessa cosa su un singolo thread (non sul thread ui) in ordine senza scrivere un mucchio di codice per accodarlo?

Edit:

Credo che questo può essere realizzato utilizzando Schedulers.single() o se si desidera che il proprio è possibile utilizzare new SingleScheduler(). Sto ancora testando, ma penso che faccia ciò che volevo quando l'ho postato.

+0

http://reactivex.io/documentation/operators/subscribeon.html https://github.com/ReactiveX/RxAndroid – corsair992

+0

Sto già utilizzando RxAndroid e il mio codice mostra che sto usando 'subscribeOn'. Non so proprio cosa passare a "subscribeOn" per fare ciò che voglio. – casolorz

+1

È necessario iscriversi su un thread in background 'Scheduler' (la [' Schedulers' class] (http://reactivex.io/RxJava/javadoc/rx/schedulers/Schedulers.html) contiene metodi di factory static per crearli). Quindi è necessario osservare su un thread principale 'Scheduler', che può essere acquisito in RxAndroid tramite il metodo' AndroidSchedulers.mainThread() '. – corsair992

risposta

12

È possibile creare un singolo thread riutilizzabile per creare un Scheduler per la Observable in uno dei seguenti modi:

  • Creare un ThreadPoolExecuter con una dimensione del pool di 1 (Executors.newSingleThreadExecutor() è un metodo factory statici conveniente per fare che), quindi utilizzarlo per generare gli scheduler tramite il metodo Schedulers.from().
  • RxAndroid offre invece una Scheduler un'implementazione personalizzata che utilizza un Handler per pianificare le azioni, e quindi può essere utilizzato con qualsiasi Thread che ha un Looper esecuzione passando è Handler al metodo AndroidSchedulers.handlerThread() fabbrica.

Nota che è necessario osservare su una filettatura principale Scheduler se si sta interagendo con l'interfaccia utente al termine di queste attività.

+6

Mi manca un metodo 'Schedulers.singleThread()' in rxjava, proprio come il suo 'newThread()'. –

+1

@AlvaroGutierrezPerez RxJava 2 ha un nuovo 'Schedulers.single()'. –

7

In RxJava 2 è possibile utilizzare Schedulers.single() cui:

Restituisce un valore predefinito, condiviso, esempio di pianificazione single-thread-backed per lavori che richiedono l'esecuzione fortemente sequenziale sullo stesso sfondo thread.

Si prega di see the documentation per ulteriori dettagli.

Non lo vedo disponibile in RxJava 1 Schedulers documentation.