Retrofit 2.0 - 自定义 CallAdapterFactory - 回调不会在 MainThread 上发生
Retrofit 2.0 - Custom CallAdapterFactory - Callbacks not happening on MainThread
我正在将我的 Android 应用程序迁移到 Retrofit 2.0。我有一个扩展 RetrofitError
的自定义 ErrorHandler,因此我可以对不同的 Http 错误做出反应。
现在我明白我必须创建自定义 CallAdapterFactory
。我使用了 ErrorHandlingCallAdapter
提供的示例 here。
我的结果 CallAdapter
几乎是相同的代码,但如果需要,我也可以 post 我的代码。
发生的事情是,当我使用这个 CallAdapterFactory
时,MainThread 上没有发生回调。我在尝试更新 UI 时得到 android.view.ViewRootImpl$CalledFromWrongThreadException
(我总是需要这样做)。我也不想总是在我的回调中用 runOnUIThread 包装我的代码。
我不知道这是否有帮助,但是当我在回调中记录 Thread.currentThread().getName()
时,它 returns 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。
你不需要创建一个新的执行器,你可以使用改造的:
public AuthCall adapt(Call call) {
return new CustomCall(call, statuses, retrofit.callbackExecutor());
}
在您调整后的调用中保留对它的引用,然后在您的回调中使用它:
customCall.enqueue(new Callback() {
executor.execute(...
我正在将我的 Android 应用程序迁移到 Retrofit 2.0。我有一个扩展 RetrofitError
的自定义 ErrorHandler,因此我可以对不同的 Http 错误做出反应。
现在我明白我必须创建自定义 CallAdapterFactory
。我使用了 ErrorHandlingCallAdapter
提供的示例 here。
我的结果 CallAdapter
几乎是相同的代码,但如果需要,我也可以 post 我的代码。
发生的事情是,当我使用这个 CallAdapterFactory
时,MainThread 上没有发生回调。我在尝试更新 UI 时得到 android.view.ViewRootImpl$CalledFromWrongThreadException
(我总是需要这样做)。我也不想总是在我的回调中用 runOnUIThread 包装我的代码。
我不知道这是否有帮助,但是当我在回调中记录 Thread.currentThread().getName()
时,它 returns 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。
你不需要创建一个新的执行器,你可以使用改造的:
public AuthCall adapt(Call call) {
return new CustomCall(call, statuses, retrofit.callbackExecutor());
}
在您调整后的调用中保留对它的引用,然后在您的回调中使用它:
customCall.enqueue(new Callback() {
executor.execute(...