如何通过 HTTP POST 方法使用 Glide 下载图像 [英] How to download an image using Glide via HTTP POST method
问题描述
Server 提供了通过 Post 请求加载图片的 API,其正文类似于
Server provides the API to load image through Post request, whose body looks like
{
"image_id": someId,
"session_id": "someId"
}
响应 - 流.
如何使用 Glide 通过 HTTP POST 方法下载图像?
Response - stream.
How to download an image using Glide via HTTP POST method?
推荐答案
使用 Glide & 加载图像的算法Retrofit 2 通过 HTTP POST 方法:
1) 创建接口,所有通过 HTTP POST 方式加载图片的请求都应该实现:
1) Create interface, which should be implemented by all requests for image loading via HTTP POST method:
public interface CacheableRequest {
String getCacheKey();
}
2) 创建要加载的模型,它将用作 Glide.with(context).load(model) 的参数:
2) Create model to load, which will be used as a parameter for Glide.with(context).load(model):
import java.io.IOException;
import java.io.InputStream;
import okhttp3.ResponseBody;
import retrofit2.Call;
public class RetrofitStream {
private final Call<ResponseBody> call;
private final CacheableRequest request;
public RetrofitStream(Call<ResponseBody> call, CacheableRequest request) {
this.call = call;
this.request = request;
}
public InputStream getStream() throws IOException {
return call.execute().body().byteStream();
}
public String getCacheKey() {
return request.getCacheKey();
}
}
3) 创建 com.bumptech.glide.load.data.DataFetcher 的实现:
3) Create an implementation of com.bumptech.glide.load.data.DataFetcher:
import android.support.annotation.Nullable;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.data.DataFetcher;
import java.io.IOException;
import java.io.InputStream;
public class RetrofitFetcher implements DataFetcher<InputStream> {
private final RetrofitStream retrofitStream;
private InputStream stream;
public RetrofitFetcher(RetrofitStream retrofitStream) {
this.retrofitStream = retrofitStream;
}
@Nullable
@Override
public InputStream loadData(Priority priority) throws Exception {
return stream = retrofitStream.getStream();
}
@Override
public void cleanup() {
if (stream != null) {
try {
stream.close();
} catch (IOException ignored) {
}
}
}
@Override
public String getId() {
return retrofitStream.getCacheKey();
}
@Override
public void cancel() {
}
}
4) 创建 com.bumptech.glide.load.model.ModelLoader 的实现:
4) Create an implementation of com.bumptech.glide.load.model.ModelLoader:
import android.content.Context;
import android.support.annotation.Keep;
import android.support.annotation.Nullable;
import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.model.GenericLoaderFactory;
import com.bumptech.glide.load.model.ModelCache;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory;
import java.io.InputStream;
public class RetrofitStreamLoader implements ModelLoader<RetrofitStream, InputStream> {
private final ModelCache<RetrofitStream, RetrofitStream> modelCache;
@Keep
public RetrofitStreamLoader() {
this(null);
}
public RetrofitStreamLoader(@Nullable ModelCache<RetrofitStream, RetrofitStream> modelCache) {
this.modelCache = modelCache;
}
@Override
public DataFetcher<InputStream> getResourceFetcher(RetrofitStream model, int width, int height) {
// GlideUrls memoize parsed URLs so caching them saves a few object instantiations and time spent parsing urls.
RetrofitStream stream = model;
if (modelCache != null) {
stream = modelCache.get(model, 0, 0);
if (stream == null) {
modelCache.put(model, 0, 0, model);
stream = model;
}
}
return new RetrofitFetcher(stream);
}
/**
* The default factory for {@link RetrofitStreamLoader}s.
*/
public static class Factory implements ModelLoaderFactory<RetrofitStream, InputStream> {
private final ModelCache<RetrofitStream, RetrofitStream> modelCache = new ModelCache<>(500);
@Override
public ModelLoader<RetrofitStream, InputStream> build(Context context, GenericLoaderFactory factories) {
return new RetrofitStreamLoader(modelCache);
}
@Override
public void teardown() {
// Do nothing.
}
}
}
5) 创建 GlideModule 的实现,它允许配置 Glide
5) Create an implementation of GlideModule, which allows configure Glide
import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.module.GlideModule;
import java.io.InputStream;
public class RetrofitGlideModule implements GlideModule {
private final static int IMAGES_CACHE_MAX_BYTE_SIZE = 20 * 1024 * 1024;
private final static String IMAGES_CACHE_PATH = "images";
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, IMAGES_CACHE_PATH, IMAGES_CACHE_MAX_BYTE_SIZE))
.setDecodeFormat(DecodeFormat.PREFER_RGB_565);
}
@Override
public void registerComponents(Context context, Glide glide) {
glide.register(RetrofitStream.class, InputStream.class, new RetrofitStreamLoader.Factory());
}
}
6) 在 AndroidManifest.xml 中添加关于创建的 RetrofitGlideModule 的元数据
6) Add meta data about created RetrofitGlideModule in AndroidManifest.xml
<application...>
<meta-data
android:name="<package>.RetrofitGlideModule"
android:value="GlideModule" />
</application>
现在您可以通过以下方式下载图片:
Call<ResponseBody> call = retrofit.getImage(cacheableRequest);
Glide.with(context).load(new RetrofitStream(call, cacheableRequest)).into(imageView);
这篇关于如何通过 HTTP POST 方法使用 Glide 下载图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!