日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Android常見問題

本文介紹使用OSS Android SDK的常見問題及解決方法。

說明

使用示例前需要進行HTTPDNS Android SDK接入,具體請參見Android SDK接入

Android SDK是否支持DNS預解析和緩存策略?

以下提供Android結合HTTPDNS SDK以及OkHttp實現DNS預解析和緩存策略的示例。更多信息,請參見AndroidHTTPDNS+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<InetAddress> lookup(String hostname) throws UnknownHostException {
            //通過異步解析接口獲取IP地址。
            String ip = httpdns.getIpByHostAsync(hostname);
            if(ip != null) {
                // 如果返回的IP地址不為null,則直接使用該IP地址進行網絡請求。
                List<InetAddress> 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-Typetext/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<String, String> 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<GetObjectRequest, GetObjectResult>() {
        @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());
            }
        }
    });