当前位置: 首页 > wzjs >正文

惠州有没有做网站明天上海封控16个区

惠州有没有做网站,明天上海封控16个区,wordpress页眉logo链接,建设部网站哪里可以报名考监理员最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程…

最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程序员,要紧的是如何解决这个问题。

首先我们拿到接口链接,我这次拿到的是这样的:

https://www.example.com/cdn/attach/{fileId}/base64

这里的{fileId} 是指图片的 id,那么正常的图片地址可以理解为:

https://www.example.com/cdn/attach/1000/base64
https://www.example.com/cdn/attach/1002/base64

熟悉 Glide 加载逻辑的人,应该很熟悉,这种方式可能需要我们自定义ModelLoader 来解决问题,们可以让 Glide 将 API 接口当作一种图片源来处理,就像处理普通的图片 URL 一样。

实现方案

我们可以自定义 Base64ApiModelLoader 来处理 base64 的请求数据:

public class Base64ApiModelLoader implements ModelLoader<String, InputStream> {private static final String BASE_URL = "https://your-api-base-url/";private static final String API_PATH = "cdn/attach/";private final OkHttpClient okHttpClient;public Base64ApiModelLoader() {this.okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).build();}@Nullable@Overridepublic LoadData<InputStream> buildLoadData(@NonNull String fileId, int width, int height, @NonNull Options options) {// 创建缓存键,使用文件ID作为唯一标识Key key = new ObjectKey(API_PATH + fileId);// 返回加载数据,包含缓存键和数据获取器return new LoadData<>(key, new Base64ApiFetcher(fileId, okHttpClient));}@Overridepublic boolean handles(@NonNull String model) {// 判断是否是文件ID格式,这里简单判断不是URLreturn !model.startsWith("http") && !model.startsWith("data:");}// 工厂类,用于创建ModelLoaderpublic static class Factory implements ModelLoaderFactory<String, InputStream> {@NonNull@Overridepublic ModelLoader<String, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {return new Base64ApiModelLoader();}@Overridepublic void teardown() {// 清理资源}}// 数据获取器,负责从API获取Base64数据并转换为InputStreamprivate static class Base64ApiFetcher implements DataFetcher<InputStream> {private final String fileId;private final OkHttpClient okHttpClient;private InputStream inputStream;private volatile boolean isCancelled;Base64ApiFetcher(String fileId, OkHttpClient okHttpClient) {this.fileId = fileId;this.okHttpClient = okHttpClient;}@Overridepublic void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {if (isCancelled) {callback.onLoadFailed(new IOException("Cancelled"));return;}// 构建API请求URLString apiUrl = BASE_URL + API_PATH + fileId + "/base64";Request request = new Request.Builder().url(apiUrl).build();try {// 执行请求Response response = okHttpClient.newCall(request).execute();if (!response.isSuccessful()) {callback.onLoadFailed(new IOException("Failed to load Base64 data: " + response.code()));return;}// 解析响应体ResponseBody responseBody = response.body();if (responseBody == null) {callback.onLoadFailed(new IOException("Empty response"));return;}// 解析JSON响应String jsonString = responseBody.string();JSONObject jsonObject = new JSONObject(jsonString);// 检查响应码int code = jsonObject.optInt("code", -1);if (code != 200) {callback.onLoadFailed(new IOException("API error: " + jsonObject.optString("message", "Unknown error")));return;}// 获取Base64数据String base64Data = jsonObject.optString("data", "");if (base64Data.isEmpty()) {callback.onLoadFailed(new IOException("Empty Base64 data"));return;}// 处理可能存在的Data URI前缀if (base64Data.contains(",")) {base64Data = base64Data.split(",")[1];}// 解码Base64数据byte[] imageBytes = Base64.decode(base64Data, Base64.DEFAULT);// 创建输入流inputStream = new ByteArrayInputStream(imageBytes);// 回调成功callback.onDataReady(inputStream);} catch (IOException | JSONException | IllegalArgumentException e) {if (!isCancelled) {callback.onLoadFailed(e);}}}@Overridepublic void cleanup() {if (inputStream != null) {try {inputStream.close();} catch (IOException ignored) {// 忽略关闭错误}}}@Overridepublic void cancel() {isCancelled = true;}@NonNull@Overridepublic Class<InputStream> getDataClass() {return InputStream.class;}@NonNull@Overridepublic DataSource getDataSource() {return DataSource.REMOTE;}}
}

定义完成ModelLoader之后,我们可能就要注册ModelLoader了。


@GlideModule
public class MyAppGlideModule extends AppGlideModule {@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {super.registerComponents(context, glide, registry);// 注册我们的自定义ModelLoader,用于处理Base64 API请求registry.append(String.class, InputStream.class, new Base64ApiModelLoader.Factory());}@Overridepublic boolean isManifestParsingEnabled() {return false;}
}

当然不能忘记需要有注解处理器

annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'

处理完之后,我们就可以这么调用了:

		Glide.with(imageView.getContext()).load(fileId)  // +.placeholder(R.mipmap.default_image).error(R.mipmap.default_image).into(imageView);

我们之前 load 方法中一直调用的是 url, 这里就直接调用 fileId 即可。因为我们已经定义了

registry.append(String.class, InputStream.class, new Base64ApiModelLoader.Factory());

其他地方都不变,即可正常进行请求了。

http://www.dtcms.com/wzjs/494531.html

相关文章:

  • 网站建设用dw西安竞价托管代运营
  • 招聘网站开发百度投放广告流程
  • 网站建设视频教程百度云b2b平台营销
  • 卢湾做网站公司苏州seo网站推广哪家好
  • 池州市建设管理处网站网络推广公司北京
  • 免费做直播网站做网站多少钱
  • 企业网站源码搭建免费广告
  • 专业网站建设制作多少钱怎么在百度免费推广
  • 哪个网站专门做灵异文seo内部优化包括哪些内容
  • 有没有专门做游戏人物的绅士视频网站武汉网络推广seo
  • 网站后台怎么用怎样宣传自己的品牌
  • 有那个网站可以做免费的投票净水器十大品牌
  • 一般网站用什么做的网络销售怎么样
  • 网站开发怎么做自动seo优化
  • 域名到期了网站会打不开吗上海网站排名优化
  • 免费观看高清正能量直播下载邯郸seo优化公司
  • 潍坊网站设计公司百度一下你就知道官网
  • jsp语言做网站制作网站的网址
  • 苗圃网站模版友情链接的形式有哪些
  • 网站报备流程搜索词
  • 黄页营销网站视频免费大全百度搜索简洁版网址
  • 龙川新闻今日头条seo快速排名代理
  • 购物网站最近浏览怎么做seo资源是什么意思
  • 企业开办网站营销网络建设
  • 怎么做网站推广软件网络广告怎么做
  • 网站设计深圳公司免费推广途径与原因
  • 网站建设找客户百度推广服务
  • 营销型网站建设标准网站设计公司报价
  • 做网站然后推广宝塔没有域名直接做网站怎么弄
  • 光谷做网站推广哪家好手机营销软件