RxAndroid & Retrofit 处理错误的最佳方法

RxAndroid & Retrofit Best approach for handling errors

我对我尝试在 Android 应用程序上实施的方法有一些疑问。

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

因为我是 Rx 的新手Android,所以我对如何实现一种通用的方式来使用通用可观察对象处理它有疑问。

服务器调用可以在 Presenter 或 Manager class 中完成,其想法是通知 Activity。

当服务器发送此错误时,使用事件总线之类的 Rx android 进行通知是否是一个好方法?

想法是每个 activity 订阅以侦听错误,如果我们收到 HttpException,我们可以通过使用像事件总线一样的 RxAndroid 与 activity 通信?

这是适合您的解决方案。它将在 Dagger 2 将被正确实施的假设下工作。越早做越好。

创建一些 Singleton SampleDAO(google Android DAO 模式)class。此 class 将负责执行 API 请求。将这个 class 注入服务内部或任何你想要的地方,并通过 performRequest Subject 的刺激来执行 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;
    }
}

在您要处理响应或错误的 Activity/Fragment 中注入演示者。

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