我正在将Android应用迁移到Retrofit 2.0。我有一个自定义的ErrorHandler扩展RetrofitError
,所以我可以对不同的Http错误作出反应。
现在我知道我必须创建自定义CallAdapterFactory
。我使用了ErrorHandlingCallAdapter
提供的here示例。
我生成的CallAdapter
代码几乎相同,但如果需要,我也可以发布我的代码。
发生的事情是,当我使用此CallAdapterFactory
时,MainThread上不会发生回调。在尝试更新UI(我总是需要)时,我得到android.view.ViewRootImpl$CalledFromWrongThreadException
。我也不想总是在我的回调中用runOnUIThread包装我的代码。
我不知道这是否有帮助,但当我在回调中记录Thread.currentThread().getName()
时,它会返回OkHttp。
答案 0 :(得分:3)
我最终将执行者传递给了我的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启发了自己。
答案 1 :(得分:1)
您不需要创建新的执行者,您可以使用改造:
public AuthCall adapt(Call call) {
return new CustomCall(call, statuses, retrofit.callbackExecutor());
}
在适应的调用中保留对它的引用,然后在回调中使用它:
customCall.enqueue(new Callback() {
executor.execute(...