NetworkOnMain使用Retrofit和下载图像时出错

时间:2016-06-01 15:05:12

标签: android retrofit2

我遇到问题,当我下载用户图片时出现NetworkOnMainThread错误。 它崩溃的线说: byte[] imgBytes = body.bytes(); 这是onResponse中的RetroFit方法。我的理解是这个方法不在主线程上。或者与UI线程有什么不同?

这是我的代码。

private void syncPersonPhoto(final DBHelper db, final ArrayList<Person> syncPersons, final int current) {
        final Person person = syncPersons.get(current);
        Call<ResponseBody> photoSyncCall = RestClient.get(context).getPersonPhoto(person.getPersonCode(), person.getPersonTypeCode());
        photoSyncCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    try {
                        byte[] imgBytes = body.bytes(); <--- ERROR HERE
                        body.close();
                        String imgBase64 = Base64.encodeToString(imgBytes, Base64.NO_WRAP);
                        db.addPersonImage(person.getPersonCode(), person.getPersonType(), imgBase64);
                    } catch (IOException e) {
                        log.log(TAG, "Bytes array couldn't be populated: " + e);
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }

有人能看到问题吗?

感谢。

2 个答案:

答案 0 :(得分:1)

ResponseBody的{​​{3}}说:

  

从源服务器到客户端应用程序的一次性流   与响应正文的原始字节。 每个响应机构都是   由与Web服务器的活动连接支持。这两者都有   客户申请的义务和限制。

您看,您对bytes()的呼叫正在使用仍然打开的网络服务器连接。此调用在onResponse回调内执行,因此在主线程内部执行,这将导致NetworkOnMainThreadException

答案 1 :(得分:0)

请求本身在后台线程中执行,是的。但是响应回调,onResponseonFailure被分派到主线程并在主线程上执行。

您在那里所做的任何工作可能与网络无关,或者您会看到您遇到的错误。