Okhttp response callbacks on the main thread Okhttp response callbacks on the main thread android android

Okhttp response callbacks on the main thread


From my understanding, Okhttp callbacks run on the main thread so why do I get this error ?

This is not true. Callbacks run on a background thread. If you want to immediately process something in the UI you will need to post to the main thread.

Since you already have a wrapper around the callback you can do this internally in your helper so that all HttpCallback methods are invoked on the main thread for convenience.


As Jake Wharton suggested, I had to run the callbacks on the main thread explicitly.

So I wrapped the calls to the callbacks with Runnable like this:

private void call(String method, String url, final HttpCallback cb) {    ...    client.newCall(request).enqueue(new Callback() {            Handler mainHandler = new Handler(context.getMainLooper());            @Override            public void onFailure(Request request,final Throwable throwable) {                mainHandler.post(new Runnable() {                    @Override                    public void run() {                        cb.onFailure(null, throwable);                    }                });            }            @Override            public void onResponse(final Response response) throws IOException {                mainHandler.post(new Runnable() {                    @Override                    public void run() {                        if (!response.isSuccessful()) {                            cb.onFailure(response, null);                            return;                        }                        cb.onSuccess(response);                    }                });            }        }); }


I know it's an old question, but recently I encountered the same issue. If you need to update any view, you will need to use runOnUiThread() or post the result back on the main thread.

HttpUtil.get(url, new Callback() { //okhttp3.Callback   @Override   public void onFailure(Call call, IOException e) { /* Handle error **/ }   @Override   public void onResponse(Call call, Response response) throws IOException {      String myResponse =  response.body().string();      //Do something with response      //...      MyActivity.this.runOnUiThread(new Runnable() {            @Override            public void run() {               //Handle UI here                                       findViewById(R.id.loading).setVisibility(View.GONE);                            }        });   }});