2017-06-11 11 views
0

これはインターフェイスです:なぜRxJavaでNull値がonNextになっていますか? (rxjava2 + retrofit2)

@GET("solicitation/get/{protocol}") 
Observable<Solicitation> getProtocol(@Path("protocol") String protocol, @Query("X-Authorization") String apiKey); 

そして、これは私のApiClientクラスであり、

if (retrofit==null) { 
     retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
       .client(httpClient.build()) 
       .build(); 

は、これは私が私のMainActivityonCreate上でそれを呼び出す方法です:

ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 

    apiService.getProtocol("2313868283", getResources().getString(R.string.api_key)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(obSol); 

これはonCreateの外です:

Observer<Solicitation> obSol = new Observer<Solicitation>() { 

    @Override 
    public void onSubscribe(@NonNull Disposable d) { 
     Log.e(TAG, "onSubscribe" + Thread.currentThread().getName()); 
    } 

    @Override 
    public void onNext(@NonNull Solicitation solicitation) { 
     Log.e(TAG, "onNext: " + solicitation.getName() + " " + Thread.currentThread().getName()); 
    } 

    @Override 
    public void onError(@NonNull Throwable e) { 
     Log.e(TAG, "onError: " + e.toString()); 
    } 

    @Override 
    public void onComplete() { 
     Log.e(TAG, "onComplete: All Done!" + Thread.currentThread().getName()); 
    } 
}; 

私はアプリの改造を実行し、その魔法を行い、そのAPI呼び出し、すべての外に結果をヤンク、私はnullを取得する以外、私は、実際の結果得ている必要があります。ここで

 06-11 12:26:31.691 22760-22760/com.example.ga.myapplication E/lol: onSubscribemain 
     06-11 12:26:31.704 22760-22798/com.example.ga.myapplication D/OkHttp: --> GET (URL HIDDEN FOR THIS POST) http/1.1 
     06-11 12:26:31.704 22760-22798/com.example.ga.myapplication D/OkHttp: --> END GET 
     06-11 12:26:31.814 22760-22801/com.example.ga.myapplication I/OpenGLRenderer: Initialized EGL, version 1.4 
     06-11 12:26:31.814 22760-22801/com.example.ga.myapplication D/OpenGLRenderer: Swap behavior 1 
     06-11 12:26:31.814 22760-22801/com.example.ga.myapplication W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 
     06-11 12:26:31.814 22760-22801/com.example.ga.myapplication D/OpenGLRenderer: Swap behavior 0 
     06-11 12:26:32.054 22760-22760/com.example.ga.myapplication W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView 
     06-11 12:26:32.511 22760-22798/com.example.ga.myapplication D/OkHttp: <-- 200 OK (URL HIDDEN FOR THIS POST) (807ms) 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Date: Sun, 11 Jun 2017 15:40:51 GMT 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Server: Apache/2.4.18 (Ubuntu) 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Access-Control-Allow-Origin: * 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Access-Control-Allow-Methods: GET, POST, OPTIONS 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Access-Control-Allow-Credentials: true 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Cache-Control: no-cache 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Set-Cookie: XSRF-TOKEN=ADA1ODc0MWRlNWZlOWM0MjJhYWNkMTc1OGZjMzk2ZDhlOGJhNTZlZDRhM2RmN2ZjMzk0NjFmOTdmIn0%3D; expires=Sun, 11-Jun-2017 17:40:51 GMT; Max-Age=7200; path=/ 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Set-Cookie: laravel_session=eiUADHiuhsaduihAIUSDVuRWpacDR4Mm5wSzljNnc0YzJ5dFBBQ2NDU5ZTFmYjg3ZmM3ZiJ9; expires=Sun, 11-Jun-2017 17:40:51 GMT; Max-Age=7200; path=/; HttpOnly 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Content-Length: 329 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Keep-Alive: timeout=5, max=100 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Connection: Keep-Alive 
     06-11 12:26:32.512 22760-22798/com.example.ga.myapplication D/OkHttp: Content-Type: application/json 
     06-11 12:26:32.514 22760-22798/com.example.ga.myapplication D/OkHttp: {"data":[{"id":5,"name":"Roll D","protocol":"2313868283"}]} 
     06-11 12:26:32.514 22760-22798/com.example.ga.myapplication D/OkHttp: <-- END HTTP (329-byte body) 
     06-11 12:26:32.520 22760-22760/com.example.ga.myapplication E/lol: onNext: null main 
     06-11 12:26:32.520 22760-22760/com.example.ga.myapplication E/lol: onComplete: All Done!main 

編集を:

が、これは、コールonNextあり、それは少し明確にするには、次の

Log.e(TAG, "onNext: " + solicitation.getName() + " " + Thread.currentThread().getName()); 

そして、これはログです:

 06-11 12:26:32.520 22760-22760/com.example.ga.myapplication E/lol: onNext: null main 

答えて

1

Webサービスによって返されるJSONはあなたのSolicitationクラスにマッピングすることができないので、それはnullです。 APIはSolicitationのリストを含むオブジェクトを返すので

class ApiResponse { 
    List<Solicitation> data; 
} 

:JSONを見て

あなたは以下のクラスでSolicitationを交換する必要が記録されます。

+0

あなたは正しいです。私の質問を拡張するために、複数の結果がある場合、どのようにそれらをロギングすることができますか?私は.mapがやると思うが、私はオブザーバーを捨てなければならないだろうか?このような状況で地図作成の仕方を知りません。 – Rosenberg

+0

'flatMapIterable'を使って、' .flatMapIterable(res - > res.data) 'のようなものをラッパーオブジェクトから抽出することができます。そして、それぞれの勧誘は別々にオブザーバーに届けられます。 – Kiskae

関連する問題