How to properly handle onError inside RxJava (Android)?

后端 未结 3 1435
南笙
南笙 2021-01-01 09:56

I\'m getting a list of installed apps on the device. It\'s a costly operation, so I\'m using Rx for that:

    Observable observable = Observable         


        
3条回答
  •  渐次进展
    2021-01-01 10:04

    My take is: you are probably using Action1 in

    .subscribe(s -> createListView(s, view));
    

    You will need to replace it with Subscriber or Observer which has abstract method onError. This method will be called from subscriber.onError(new Throwable());

    EDIT: This is how I would do it. Upon closer look I think the main problem in your code is the early part where you call subscriber.onError even when there's no error. You probably don't need map either because you are technically passing data as-is without manipulation. But I left it in case it is needed later.

         Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                List result = getUserApps();
                if (result != null){
                    for (Application app : result){
                         subscriber.onNext(app);
                    }
                    subscriber.onComplete();
                }else{
                    subscriber.onError(new IOException("no permission / no internet / etc"));
                   //or if this is a try catch event you can pass the exception
                }     
            }
         })
        .subscribeOn(Schedulers.io())//the thread *observer* runs in
        .observeOn(AndroidSchedulers.mainThread())//the thread *subscriber* runs in
        .map(new Func1() {
    
            // Mapping methods are where data are manipulated. 
            // You can simply skip this and 
            //do the same thing in Subscriber implementation
            @Override
            public String call(Application application) {
                return application.getName();
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
               Toast.makeText(context, "completed", Toast.LENGTH_SHORT).show();
               //because subscriber runs in main UI thread it's ok to do UI stuff
               //raise Toast, play sound, etc
            }
    
            @Override
            public void onError(Throwable e) {
               Log.e("getAppsError", e.getMessage());
               //raise Toast, play sound, etc
            }
    
            @Override
            public void onNext(String s) {
                listAdapter.add(s);
            }
        });
    

提交回复
热议问题