RxAndroid&改进处理错误的最佳方法

时间:2016-04-27 14:56:12

标签: android retrofit rx-android

我对我尝试在Android应用上实施的方法有些怀疑。

当用户丢失会话或已过期时,应用程序的服务可以发送http错误代码。

由于我是RxAndroid的新手,我对如何使用Generic observable实现处理它的通用方法表示怀疑。

服务器调用可以在Presenter或Manager类中完成,其目的是通知Activity。

当服务器发送此错误时,使用像事件总线这样的Rx android进行通知是一种很好的方法吗?

这个想法是每个活动订阅监听错误,如果我们得到HttpException,我们可以使用像事件总线这样的RxAndroid与活动进行通信?

1 个答案:

答案 0 :(得分:2)

以下是适合您的解决方案。假设Dagger 2将得到正确实施,它将起作用。你做得越早 - 对你来说就越好。

创建一些Singleton SampleDAO(谷歌Android DAO模式)类。该类将负责执行API请求。在服务中或任何你想要的地方注入这个类,并通过像这样的performRequest主题的刺激来执行API请求 - sampleDao.performRequest()。onNext(null);

import android.support.annotation.NonNull;

import javax.inject.Singleton;

import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;

@Singleton
public class SampleDao {

    @NonNull
    PublishSubject<Object> performRequest = PublishSubject.create();
    @NonNull
    Observable<SomeData> apiResponse;

    public SampleDao(final @NonNull ApiService apiService) {

        apiResponse = performRequest
                .switchMap(new Func1<Object, Observable<SomeData>>() {
                    @Override
                    public Observable<SomeData> call(Object o) {
                        return apiService.apiRequest()
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribeOn(Schedulers.io());
                    }
                });
    }

    @NonNull
    public Observable<SomeData> getApiResponse() {
        return apiResponse;
    }

    @NonNull
    public Observer<Object> performRequest() {
        return performRequest;
    }
}

您还需要创建演示者。在这个演示者中传递SampleDao作为构造函数的引用(Dagger 2处理这个)。

import android.support.annotation.NonNull;

import rx.Observable;

public class SamplePresenter {

    @NonNull
    private final Observable<SomeData> someDataObservable;

    public SamplePresenter(SampleDao sampleDao) {

        someDataObservable = sampleDao.getApiResponse();
    }

    @NonNull
    public Observable<SomeData> getSomeDataObservable() {
        return someDataObservable;
    }
}

在活动/片段中注入要处理响应或错误的演示者。

import android.os.Bundle;
import android.widget.Toast;

import com.trello.rxlifecycle.components.RxActivity;

import javax.inject.Inject;

import rx.Subscriber;


public class MainActivity extends RxActivity {

    @Inject
    SamplePresenter samplePresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        samplePresenter.getSomeDataObservable()
                .compose(this.<SomeData>bindToLifecycle())
                .subscribe(new Subscriber<SomeData>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        final ErrorHelper errorHelper = new ErrorHelper(getResources(), e);
                        Toast.makeText(MainActivity.this, errorHelper.getErrorMessage(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNext(SomeData someData) {
                    }
                });
    }
}