我对我尝试在Android应用上实施的方法有些怀疑。
当用户丢失会话或已过期时,应用程序的服务可以发送http错误代码。
由于我是RxAndroid的新手,我对如何使用Generic observable实现处理它的通用方法表示怀疑。
服务器调用可以在Presenter或Manager类中完成,其目的是通知Activity。
当服务器发送此错误时,使用像事件总线这样的Rx android进行通知是一种很好的方法吗?
这个想法是每个活动订阅监听错误,如果我们得到HttpException,我们可以使用像事件总线这样的RxAndroid与活动进行通信?
答案 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) {
}
});
}
}