在實際開發中,頁面關閉,取消請求是很常見的需求,這裏分享一種簡單的實現方法。 個人思路是把網絡請求和上下文的生命週期綁定。這裏用用到了Rxjava的Subject,Subject 既是 Observable 又是 Observer(Subscriber)。既能夠發消息也能夠接收消息。java
我首先定義了幾個枚舉,對應上下文的生命週期。後端
public enum ActivityLifeCycleEvent {
CREATE,START,RESUME,PAUSE,STOP,DESTROY
}
複製代碼
以Fragment
爲例,在BaseFragment
中,相應的生命週期回調中發射消息。bash
import rx.subjects.PublishSubject;
public abstract class BaseFragment extends Fragment {
protected final PublishSubject<ActivityLifeCycleEvent> lifecycleSubject = PublishSubject.create();
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
@Override
public void onPause() {
super.onPause();
lifecycleSubject.onNext(ActivityLifeCycleEvent.PAUSE);
}
@Override
public void onStop() {
super.onStop();
lifecycleSubject.onNext(ActivityLifeCycleEvent.STOP);
}
@Override
public void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityLifeCycleEvent.RESUME);
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycleSubject.onNext(ActivityLifeCycleEvent.DESTROY);
}
}
複製代碼
通常狀況下咱們會使用Retrofit+Rxjava來進行網絡請求,好比像下面這樣:網絡
@Multipart
@POST(Urls.TIMER_GETUSERDETAIL_RX)
Observable<Results<User>> getUser(@PartMap Map<String, RequestBody> map);
複製代碼
具體請求的時候多是下面這樣ide
ApiService.instancce()
.getUser(p.build())
.takeUntil(bindLifeCycle(lifecycleSubject,ActivityLifeCycleEvent.DESTROY))
.subscribe({
……
})
複製代碼
注意:下面這句話ui
.takeUntil(RxUtils.bindLifeCycle(lifecycleSubject, ActivityLifeCycleEvent.DESTROY))
複製代碼
takeUntil
一旦響應是成功它將自動終止源Observable因而中止向後端發送數據。若是不是則繼續發送請求。這裏若是收到ActivityLifeCycleEvent.DESTROY
消息,就會中止向後端發送數據。spa
public static Observable<ActivityLifeCycleEvent> bindLifeCycle(PublishSubject<ActivityLifeCycleEvent> lifecycleSubject, ActivityLifeCycleEvent bindEvent) {
return lifecycleSubject.takeFirst(activityLifeCycleEvent -> activityLifeCycleEvent.equals(bindEvent));
}
複製代碼
嗯,就這麼多。下面就是愉快地使用吧~code
本方法只是取消了接受網絡數據以後的後續操做,並非真正中止了當前的請求哦~server