Retrofit 2.0 - 自定义CallAdapterFactory - MainThread上没有发生回调

时间:2015-11-28 17:19:26

标签: android retrofit

我正在将Android应用迁移到Retrofit 2.0。我有一个自定义的ErrorHandler扩展RetrofitError,所以我可以对不同的Http错误作出反应。

现在我知道我必须创建自定义CallAdapterFactory。我使用了ErrorHandlingCallAdapter提供的here示例。

我生成的CallAdapter代码几乎相同,但如果需要,我也可以发布我的代码。

发生的事情是,当我使用此CallAdapterFactory时,MainThread上不会发生回调。在尝试更新UI(我总是需要)时,我得到android.view.ViewRootImpl$CalledFromWrongThreadException。我也不想总是在我的回调中用runOnUIThread包装我的代码。

我不知道这是否有帮助,但当我在回调中记录Thread.currentThread().getName()时,它会返回OkHttp。

2 个答案:

答案 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(...