2016-04-27 28 views
4

我對我嘗試在Android應用上實現的方法有一些懷疑。RxAndroid&Retrofit處理錯誤的最佳方法

該應用的服務能夠在用戶失去會話或已過期時發送http錯誤代碼。

由於我是新的RxAndroid我懷疑如何實現通用方法來處理它與通用觀察。

服務器調用可以在Presenter或Manager類中完成,其想法是通知活動。

當服務器發送此錯誤時,使用Rx android如Event Bus進行通知是否會是一種好方法?

這個想法是,每個活動訂閱聽錯誤,並在萬一我們得到一個HttpException我們可以通過使用RxAndroid像活動總線與活動進行通信?

回答

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

在您想要處理響應或錯誤的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) { 
        } 
       }); 
    } 
} 
+0

你能解釋「compose(這個。 bindToLifecycle())」的功能是什麼嗎?你如何處理Activity的生命週期? –

+0

它可以防止內存泄漏。你可以在這裏閱讀關於它的一些信息github.com/trello/RxLifecycle。它還可以防止NPE在視圖被釋放後觀察到散射值,並且您正嘗試在訂閱動作 – Rzodkiewka

+0

中設置一些值謝謝!我會仔細檢查它! –