這是您的解決方案。它將在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;
}
}
在您想要處理響應或錯誤的Activity/Fragment中插入Presenter。
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) {
}
});
}
}
你能解釋「compose(這個。 bindToLifecycle())」的功能是什麼嗎?你如何處理Activity的生命週期? –
它可以防止內存泄漏。你可以在這裏閱讀關於它的一些信息github.com/trello/RxLifecycle。它還可以防止NPE在視圖被釋放後觀察到散射值,並且您正嘗試在訂閱動作 – Rzodkiewka
中設置一些值謝謝!我會仔細檢查它! –