详情页标题前

阿里云对象存储OSSAndroid常见问题-云淘科技

详情页1

本文介绍使用OSS Android SDK的常见问题及解决方法。

Android SDK是否支持DNS预解析和缓存策略?

以下提供Android结合HTTPDNS SDK以及OkHttp实现DNS预解析和缓存策略的示例。更多信息,请参见Android端HTTPDNS+OkHttp接入指南。

  1. 自定义DNS接口
    public class OkHttpDns implements Dns {
        private static final Dns SYSTEM = Dns.SYSTEM;
        HttpDnsService httpdns;
        private static OkHttpDns instance = null;
        private OkHttpDns(Context context) {
            this.httpdns = HttpDns.getService(context, "account id");
        }
        public static OkHttpDns getInstance(Context context) {
            if(instance == null) {
                instance = new OkHttpDns(context);
            }
            return instance;
        }
        @Override
        public List lookup(String hostname) throws UnknownHostException {
            //通过异步解析接口获取IP地址。
            String ip = httpdns.getIpByHostAsync(hostname);
            if(ip != null) {
                // 如果返回的IP地址不为null,则直接使用该IP地址进行网络请求。
                List inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));
                Log.e("OkHttpDns", "inetAddresses:" + inetAddresses);
                return inetAddresses;
            }
            // 如果返回的IP地址为null,则通过系统DNS服务解析域名。
            return Dns.SYSTEM.lookup(hostname);
        }
    }
  2. 生成okHttpClient实例,并配置到OSS。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    
    ClientConfiguration conf = new ClientConfiguration();
    conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
    conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
    conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个。
    conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
    
    OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .dns(OkHttpDns.getInstance(getApplicationContext()));
    // 如果设置了自定义的okHttpClient,ClientConfiguration的部分设置将会失效。您需要将其手动设置到builder上。
    if (conf != null) {
        Dispatcher dispatcher = new Dispatcher();
        dispatcher.setMaxRequests(conf.getMaxConcurrentRequest());
    
        builder.connectTimeout(conf.getConnectionTimeout(), TimeUnit.MILLISECONDS)
                .readTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
                .writeTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
                .followRedirects(conf.isFollowRedirectsEnable())
                .followSslRedirects(conf.isFollowRedirectsEnable())
                .dispatcher(dispatcher);
    
        if (conf.getProxyHost() != null && conf.getProxyPort() != 0) {
            builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(conf.getProxyHost(), conf.getProxyPort())));
        }
    }
    // 仅Android SDK 2.9.12或以上版本支持使用conf.setOkHttpClient();方法。
    conf.setOkHttpClient(builder.build());
    
    OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);

部分文件下载时,进度回调显示totalSize=-1

  • 问题原因

    当文件Content-Type为text/cache-manifest、text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、application/json或者text/json,且文件大于或者等于1 KB时,如果Header中显式设置了Accept-Encoding:gzip,则OSS会返回经过Gzip压缩的数据。下载文件时,即使未设置Accept-Encoding,okhttp也会自动填充为Accept-Encoding:gzip。而经过Gzip压缩后无法得知文件大小,即不会返回Content-Length,因此进度回调显示totalSize=-1。

  • 解决方法

    通过设置Range的方式阻断okhttp自动填充Accept-Encoding:gzip,此时将返回Content-Length,并正常显示进度回调。

    Map header = new HashMap();
    header.put("x-oss-range-behavior", "standard");
    // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。
    GetObjectRequest get = new GetObjectRequest("examplebucket", "exampledir/exampleobject.txt");
    get.setRange(new Range(0, -1));
    get.setRequestHeaders(header);
    OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback() {
        @Override
        public void onSuccess(GetObjectRequest request, GetObjectResult result) {
            // 请求成功。
            InputStream inputStream = result.getObjectContent();
    
            byte[] buffer = new byte[2048];
            int len;
    
            try {
                while ((len = inputStream.read(buffer)) != -1) {
                    // 处理下载的数据。
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
            // 请求异常。
            if (clientExcepion != null) {
                // 本地异常如网络异常等。
                clientExcepion.printStackTrace();
            }
            if (serviceException != null) {
                // 服务异常。
                Log.e("ErrorCode", serviceException.getErrorCode());
                Log.e("RequestId", serviceException.getRequestId());
                Log.e("HostId", serviceException.getHostId());
                Log.e("RawMessage", serviceException.getRawMessage());
            }
        }
    });

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/159745.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云对象存储OSSJava断点续传上传-云淘科技

    通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。 注意事项 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关…

    阿里云对象存储 2023年12月10日
  • 阿里云大数据开发治理平台 DataWorks最佳实践:数据开发、提交与运行OpenAPI基础实践-云淘科技

    DataWorks提供了丰富的OpenAPI,您可以根据需要使用DataWorks的OpenAPI等开放能力实现各种业务场景。本文以数据开发为例,为您示例如何使用OpenAPI快速进行数据开发、提交与运行。 背景信息 本实践将满足以下业务场景的需求,建议您先学习了解不同业务场景涉及的核心能力与概念。 查询与管理工作空间列表、业务流程列表、节点文件夹与节点列表…

    2023年12月10日
  • 阿里云RDS数据库管理报警-云淘科技

    您可以设置报警规则,系统在监控数据满足条件时,会通知报警联系组中的所有联系人。 背景信息 监控报警是通过阿里云监控产品实现的。通过阿里云监控产品,您可以设置监控项,并在触发监控项的报警规则时,通过邮件和短信通知报警联系组中的所有联系人。您可以维护报警监控项对应的报警联系组,以便发生报警时,能及时通知到相关联系人。 其他引擎设置报警规则请参见: RDS SQL…

    2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云云原生大数据计算服务 MaxCompute本地运行-云淘科技

    本文向您介绍本地和分布式环境运行MapReduce的差异和MapReduce本地运行示例。 各阶段介绍 本地运行前:通过在Jar命令中设置–local参数,在本地模拟MapReduce的运行过程,从而进行本地调试。 本地运行时:客户端会从MaxCompute中下载本地调试所需要的输入表的元信息、数据,所需要的资源以及输出表的元信息,并将这些信息保存到一个名为…

  • 阿里云ECS云服务器DescribeSendFileResults-云淘科技

    调用DescribeSendFileResults查询云助手下发文件列表及状态。 接口说明: 当您下发文件后,不代表文件一定成功下发。您需要通过接口返回值查看实际下发结果,并以实际输出结果为准。 您可以查询最近6周的下发记录。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可…

    阿里云服务器 2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。