我正在将Android应用程序迁移到Retrofit 2.0.我有一个扩展了RetrofitError的自定义ErrorHandler,因此我可以对不同的Http错误做出反应.
现在,我知道必须创建一个自定义的CallAdapterFactory.我使用提供的示例ErrorHandlingCallAdapter here.
我生成的CallAdapter几乎是相同的代码,但是如果需要,我也可以发布我的代码.
发生的是,当我使用此CallAdapterFactory时,在MainThread上没有发生回调.尝试更新UI时,我得到android.view.ViewRootImpl $CalledFromWrongThreadException(我一直需要).我也不想总是将我的代码与runOnUIThread一起包装在我的回调中.
我不知道这是否有帮助,但是当我在回调中记录Thread.currentThread().getName()时,它将返回OkHttp.
解决方法:
我最终将执行程序传递给我的CallAdapter.Factory:
public static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable r) {
handler.post(r);
}
}
…
.addCallAdapterFactory(new ErrorHandlingCallAdapter.ErrorHandlingCallAdapterFactory(new MainThreadExecutor()))
并将回调包装在:
callbackExecutor.execute(new Runnable() {
@Override
public void run() {
}
});
我从this开始启发自己.