我遇到问题,当我下载用户图片时出现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) {
}
});
}
有人能看到问题吗?
感谢。
答案 0 :(得分:1)
ResponseBody
的{{3}}说:
从源服务器到客户端应用程序的一次性流 与响应正文的原始字节。 每个响应机构都是 由与Web服务器的活动连接支持。这两者都有 客户申请的义务和限制。
您看,您对bytes()
的呼叫正在使用仍然打开的网络服务器连接。此调用在onResponse
回调内执行,因此在主线程内部执行,这将导致NetworkOnMainThreadException
。
答案 1 :(得分:0)
请求本身在后台线程中执行,是的。但是响应回调,onResponse
和onFailure
被分派到主线程并在主线程上执行。
您在那里所做的任何工作可能与网络无关,或者您会看到您遇到的错误。