AndroidRX - run a method in the background

I created a simple activity using the progres infinity panel, and I'm trying to run a multi-user method using RxJava to prevent the user interface thread from being blocked, but every time the user interface thread is blocked. I think my solution to the issue of emitting an Observable. Can someone help me? I start at RX.

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void doSomething(View view) { doHeavyStuff() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(new Action1() { @Override public void call(Object o) { Toast.makeText(getApplicationContext(), "FINISHED", Toast.LENGTH_SHORT).show(); } }) .subscribe(); } private Observable doHeavyStuff() { for (int i = 0; i < 999999999; i++) { for (int j = 0; j < 2; j++) { } } return Observable.just(1); } 
+5
source share
4 answers

Your doHeavyStuff () performs the calculation when the stream is called, you just transfer your result to the Observable. To wrap the calculation in observable, you must use defer

 Observable.defer(new Func0<Observable<Integer>>() { @Override public Observable<Integer> call() { return Observable.just(doHeavyStuff()); } }); 

then you can specify streams using the labels subscribeOn and observOn

+8
source

According to docs

Deprecated: fromFunc0 Unnecessary now that Func0 extends Callable. Instead, just call fromCallable (java.util.concurrent.Callable).

So you can make a call this way:

 Observable.fromCallable(new Callable<Object>() { @Override public Object call() throws Exception { return someMethod(); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Object>() { @Override public void call(Object object) { } }); 
+7
source

In RxJava2, a solution is possible:

Version with lambdas:

 Single.fromCallable(() -> loadInBackground()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((myObject) -> { updateUi(myObject) }); 

Version without lambdas:

 Single.fromCallable(new Callable<Object>() { @Override public Object call() throws Exception { return loadInBackground(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Object>() { @Override public void accept(Object myObject) throws Exception { updateUi(myObject); } }); 

Examples of methods:

 private Object loadInBackground() { // some heavy load code return myObject; } private void updateUi(Object myObject) { // update your Views here } 
+4
source

Alternatively, you can use RxJavaAsyncUtil :

 compile 'io.reactivex:rxjava-async-util:0.21.0' 

code:

 Observable.fromFunc0(() -> doHeavyStuff()) 
+1
source

All Articles