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); } }); }});