Glide:DataFetcher<InputStream> loadDatareturn 应该做什么?
Glide: What should DataFetcher<InputStream> loadData return?
我是 Glide 的新手,我自己的 ModelLoader
实现遇到了问题。
我以OkHttp Glide integration classes为基础
在我的 GlideModule 中,我调用:
registry.append(GlideUrl.class, InputStream.class,
new TauaOkHttpLoader.Factory(applicationComponent.tauaOkHttpClient()));
其中 applicationComponent.tauaOkHttpClient()
returns 一个有效的 OkHttpClient
和必要的 headers (我检查过了)。
然后,在我的 HttpLoader
中,我的实现与上面 link 中提供的 class 几乎相同。我创建它是为了使用我的 OkHttpStreamFetcher
,我是这样得到结果的:
Request.Builder requestBuilder = new
Request.Builder().url(url.toStringUrl());
for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
String key = headerEntry.getKey();
requestBuilder.addHeader(key, headerEntry.getValue());
}
Request request = requestBuilder.build();
call = client.newCall(request);
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onLoadFailed(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
responseBody = response.body();
if (response.isSuccessful()) {
String encodedImage = responseBody.string();
long contentLength = encodedImage.length();
ByteArrayInputStream inputStream =
new ByteArrayInputStream(Base64.decode(encodedImage, Base64.DEFAULT));
stream = ContentLengthInputStream.obtain(inputStream, contentLength);
callback.onDataReady(inputStream);
} else {
callback.onLoadFailed(new HttpException(response.message(), response.code()));
}
}
});
即使我得到一个有效的编码字符串并正确创建 ByteArrayInputStream
,它仍然会抛出错误。我已经调试了几次,它得到了正确的结果。我还尝试将我的提取器更改为 DataFetcher<byte[]>
和 DataFetcher<Bitmap>
并附加它,但我的提取器甚至不会被调用。这是 logcat:
我做错了什么?
显然,我传递的 contentLength
不正确。给Base64.decode(encodedImage, Base64.DEFAULT)
返回的数组长度赋值后,成功了!
我是 Glide 的新手,我自己的 ModelLoader
实现遇到了问题。
我以OkHttp Glide integration classes为基础
在我的 GlideModule 中,我调用:
registry.append(GlideUrl.class, InputStream.class,
new TauaOkHttpLoader.Factory(applicationComponent.tauaOkHttpClient()));
其中 applicationComponent.tauaOkHttpClient()
returns 一个有效的 OkHttpClient
和必要的 headers (我检查过了)。
然后,在我的 HttpLoader
中,我的实现与上面 link 中提供的 class 几乎相同。我创建它是为了使用我的 OkHttpStreamFetcher
,我是这样得到结果的:
Request.Builder requestBuilder = new
Request.Builder().url(url.toStringUrl());
for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
String key = headerEntry.getKey();
requestBuilder.addHeader(key, headerEntry.getValue());
}
Request request = requestBuilder.build();
call = client.newCall(request);
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onLoadFailed(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
responseBody = response.body();
if (response.isSuccessful()) {
String encodedImage = responseBody.string();
long contentLength = encodedImage.length();
ByteArrayInputStream inputStream =
new ByteArrayInputStream(Base64.decode(encodedImage, Base64.DEFAULT));
stream = ContentLengthInputStream.obtain(inputStream, contentLength);
callback.onDataReady(inputStream);
} else {
callback.onLoadFailed(new HttpException(response.message(), response.code()));
}
}
});
即使我得到一个有效的编码字符串并正确创建 ByteArrayInputStream
,它仍然会抛出错误。我已经调试了几次,它得到了正确的结果。我还尝试将我的提取器更改为 DataFetcher<byte[]>
和 DataFetcher<Bitmap>
并附加它,但我的提取器甚至不会被调用。这是 logcat:
我做错了什么?
显然,我传递的 contentLength
不正确。给Base64.decode(encodedImage, Base64.DEFAULT)
返回的数组长度赋值后,成功了!