2016-11-02 4 views
0

私はrxjava、retrofit2、okhttp3を使用しています。onError、RxJavaの値を使用したい

Log.dを入力するだけで、どのように動作し、ログは以下のように表示されます。

1. D/-- NetPresenter: checkConnectivity 
2. D/-- NetPresenter: Observable 
3. D/-- NetPresenter: onNext 
4. D/-- MessageSetter: setMessage 
5. D/-- MainActivity setText: setText 
6. D/-- NetPresenter: onCompleted 
7. D/-- NetChecker: onError 
8. D/-- error msg: failed to connect to /192.168.0.27 (port 8081) after 5000ms 

onErrorから値 "code"を取得した後でTextViewを設定する必要があります。

つまり、#7は#5より前に処理する必要があります。

リクエスト接続時にタイムアウトオプションがあると思いますが、どこで修正するのかわかりません。

誰でも私がそれを理解するのを助けることができますか?

ありがとうございました。

クラス1

public void checkConnectivity(Context context) { 
    Log.d("-- NetPresenter", "checkConnectivity"); 
    this.context = context; 
    myObservable.subscribe(mySubscriber); 
} 

private Observable<Integer> myObservable = Observable.create(
     new Observable.OnSubscribe<Integer>() { 
      @Override 
      public void call(Subscriber<? super Integer> sub) { 
       Log.d("-- NetPresenter", "Observable"); 
       int connType = cc.getConnectionStatus(context); 
       sub.onNext(connType); 
       sub.onCompleted(); 
      } 
     } 
); 

private Subscriber<Integer> mySubscriber = new Subscriber<Integer>() { 

    @Override 
    public void onNext(Integer connType) { 
     Log.d("-- NetPresenter", "onNext"); 
     int code = nc.netChecker(connType); 
     view.updateReceivedMessageTextView(ms.setMessage(code)); 
    } 

    @Override 
    public void onCompleted() { 
     Log.d("-- NetPresenter", "onCompleted"); 
    } 

    @Override 
    public void onError(Throwable e) { 
     Log.d("-- NetPresenter", "onError"); 
    } 
}; 

クラス2.

public int netChecker(int connType) { 

    final OkHttpClient okHttpClient = new OkHttpClient.Builder() 
      .readTimeout(5, TimeUnit.SECONDS) 
      .connectTimeout(5, TimeUnit.SECONDS) 
      .build(); 

    retrofit = new Retrofit.Builder() 
      .baseUrl(ApiService.API_URL) 
      .client(okHttpClient) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
    apiService = retrofit.create(ApiService.class); 


    Observable<Response<ResponseBody>> result = apiService.getData("database"); 

    result.subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Response<ResponseBody>>() { 
       @Override 
       public void onCompleted() { 
       } 

       @Override 
       public void onError(Throwable e) { 
        if(connType/10 == 0) code = 0; 
        else     code = connType+1; 

        Log.d("-- NetChecker", "onError"); 
        Log.d("-- error msg", e.getMessage()); 
       } 

       @Override 
       public void onNext(Response<ResponseBody> response) { 
        Log.d("-- NetChecker", "onNext"); 
        Log.d("message", response.message()); 
        Log.d("code", "code :"+ response.code()); 
        code = connType; 
       } 

      }); 
    return code; 
} 

答えて

0

RxJavaの利点は非同期です。評価の順序を予測することはできません。私はあなたが "onError"メソッドからMainActivityに到達すべきだと考えます。どういうわけかMVPパターンを使っているのが分かります。それは助けになるはずです。あなたがクラスの関係についてのより多くの情報を提供すれば、私はもっと言うことができます。

+0

ヒントありがとうございました。私はそれを把握することができると思う! –

1

エラーに何らかのアクションを行うために.doOnError()メソッドを使用することができます。 もう1つのメソッド.onErrorReturn()があります。これは、エラーを代行受信し、代わりに値を返します。そのため、シーケンスは終了しません。これらの方法の両方を使用することができます。

+0

ありがとうございました。役に立った –

関連する問題