2016-04-04 10 views
0

すべてのコールとコールバックが正常に機能します。私は、HTTPエラーコードのために(同じコールバックで)コールバック内でコールをクローンして再試行する問題があります。コールをクローンすると、コールバックがメインスレッドから呼び出されます。

public static abstract class MyCallback<T> implements Callback<T> { 
    @Override 
    public void onResponse(Call<T> call, retrofit2.Response<T> response) { 
     Timber.d("is this the main thread %b", Looper.myLooper() == Looper.getMainLooper()); 
     if (response.isSuccessful()) { 
      //success handling 
     } else { 
      if (response.code() == 406) { 
       // remedy reason for failure 
       call.clone().enqueue(MyCallback.this); 
      } 
     } 
    } 

    @Override 
    public void onFailure(Call<T> call, Throwable t) { 
     Timber.e("onFailure %s", t.getMessage()); 
    } 
} 

これは与える:

is this the main thread true 
is this the main thread false 
is this the main thread false 
is this the main thread false 
is this the main thread false 
[looping] 

を私は新しいコールを開始する、新しい/他のコールバックで遊んなど私はコールのクローンを作成する場合にのみ、コールバックがメインスレッドをオフに呼び出されます。 実際に発生する問題は、再試行が成功した後にUIを変更できないことです。

レトロフィット2.0.1を使用しています。

+0

は、あなたはそれがメインスレッド上で動作していないことが確実か? UIを変更しようとしましたが、例外がありますか? – muratgu

+0

@muratguはい。私は「ビューは作成されたスレッドからしか編集できません」という例外を持っているので、私はそれを見つけただけです。それだけで私は含まれませんでした。これらのルーパがログをチェックします。 – Till

+1

私はあなたがretrofitかokhttpのどちらかでバグを見つけたと思います。私は、コールがエンキューする前にクローンメソッドを介して作成されている場合、コールバックの実行スレッドがメインスレッドではないことを確認しました。 – muratgu

答えて