Glide如何加载https图片(简明操作)

本文介绍使用Glide加载HTTPS图片的方法,包括Gradle依赖配置、证书设置及HTTPS客户端初始化等关键步骤,确保图片安全加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Glide如何加载https图片(简明操作)

利用以下简明步骤可以快速完成Glide加载https图片
- gradle引用

compile ‘com.squareup.okhttp3:okhttp:3.3.1’
compile ‘com.github.bumptech.glide:glide:3.7.0’

/提供的Module/

compile ‘com.github.bumptech.glide:okhttp3-integration:1.4.0@aar’

可在application中操作

1.设置证书传入

try {
    InputStream[] InputStream = new InputStream[1];
    InputStream input = getApplication().getAssets().open("CA_.cer");
    InputStream[0] = input;
} catch (IOException e) {
     e.printStackTrace();
}

2.初始化

//让Glide能用HTTPS 
Glide.get(this.getApplication()).register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(HttpsUtils.getOkHttpClient(InputStream)));

3.创建HttpsUtils类

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

import okhttp3.OkHttpClient;

/**
 * 设置允许Https
 */

public class HttpsUtils{
    public static SSLSocketFactory getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password){
        try{
            TrustManager[] trustManagers = prepareTrustManager(certificates);
            KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManager trustManager = null;
            if (trustManagers != null){
                trustManager = new MyTrustManager(chooseTrustManager(trustManagers));
            } else{
                trustManager = new UnSafeTrustManager();
            }
            sslContext.init(keyManagers, new TrustManager[]{trustManager}, new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (NoSuchAlgorithmException e){
            throw new AssertionError(e);
        } catch (KeyManagementException e){
            throw new AssertionError(e);
        } catch (KeyStoreException e){
            throw new AssertionError(e);
        }
    }

    private class UnSafeHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session){
            return true;
        }
    }

    private static class UnSafeTrustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException{}

        @Override
        public X509Certificate[] getAcceptedIssuers(){
            return new X509Certificate[]{};
        }
    }

    private static TrustManager[] prepareTrustManager(InputStream... certificates){
        if (certificates == null || certificates.length <= 0) return null;
        try{
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            for (InputStream certificate : certificates){
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
                try{
                    if (certificate != null)
                        certificate.close();
                } catch (IOException e){
                }
            }
            TrustManagerFactory trustManagerFactory = null;
            trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            return trustManagers;
        } catch (NoSuchAlgorithmException e){
            e.printStackTrace();
        } catch (CertificateException e){
            e.printStackTrace();
        } catch (KeyStoreException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;

    }

    private static KeyManager[] prepareKeyManager(InputStream bksFile, String password){
        try{
            if (bksFile == null || password == null) return null;
            KeyStore clientKeyStore = KeyStore.getInstance("BKS");
            clientKeyStore.load(bksFile, password.toCharArray());
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(clientKeyStore, password.toCharArray());
            return keyManagerFactory.getKeyManagers();
        } catch (KeyStoreException e){
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e){
            e.printStackTrace();
        } catch (UnrecoverableKeyException e){
            e.printStackTrace();
        } catch (CertificateException e){
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers){
        for (TrustManager trustManager : trustManagers){
            if (trustManager instanceof X509TrustManager){
                return (X509TrustManager) trustManager;
            }
        }
        return null;
    }

    private static class MyTrustManager implements X509TrustManager{
        private X509TrustManager defaultTrustManager;
        private X509TrustManager localTrustManager;

        public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException{
            TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            var4.init((KeyStore) null);
            defaultTrustManager = chooseTrustManager(var4.getTrustManagers());
            this.localTrustManager = localTrustManager;
        }

        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{}

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{
            try{
                defaultTrustManager.checkServerTrusted(chain, authType);
            } catch (CertificateException ce){
                localTrustManager.checkServerTrusted(chain, authType);
            }
        }

        @Override
        public X509Certificate[] getAcceptedIssuers(){
            return new X509Certificate[0];
        }
    }

    public static OkHttpClient getOkHttpClient(InputStream... certificates)
    {
        SSLSocketFactory sslSocketFactory = HttpsUtils.getSslSocketFactory(certificates, null, null);
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        builder = builder.sslSocketFactory(sslSocketFactory);
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session)
            {
                return true;
            }
        });
        return builder.build();
    }
}

创建完成,Glide就可以加载Https图片

引用

ImageLoader和Glide加载Https的图片

<think>嗯,用户想逐一回答关于Android开发的多个技术问题,包括UI设计、自定义控件、数据存储、OOM处理、网络请求、开源框架和生命周期这些方面。我需要参考之前的引用和回答,确保每个部分都覆盖到关键点,并且正确引用相关的内容。首先,UI设计部分,用户提到了ConstraintLayout和性能优化。引用[1]里提到过计算view的嵌套层级,所以这里需要强调ConstraintLayout减少嵌套的优势。可能还要提到MaterialDesign的规范,引用[2]中的主题应用。 然后是自定义控件开发,引用[3]里有提到View的刷新机制和绘制流程,这里需要详细说明onMeasure、onDraw等方法,以及事件处理,结合引用[1]的事件分发机制。数据存储方面,引用[1]中的ContentProvider权限管理,还有SharedPreferences和Room,需要对比不同存储方式的适用场景,可能用表格展示更清晰。 OOM处理部分,引用[1]和[3]都有涉及内存泄漏和Bitmap处理,需要提到LeakCanary和LruCache,同时解释OOM的原因和解决方案。网络请求和JSON解析,用户提到OkHttp和Gson,引用之前的示例代码,可能需要展示基本用法,并说明如何与后台接口对接,引用[1]中的线程问题,比如在子线程处理网络请求避免阻塞UI。开源框架部分,需要列举常用框架如Retrofit、Glide,并说明它们的优势,引用[2]中的类加载机制可能相关,但可能更侧重于框架的使用而非底层原理。生命周期方面,引用[3]中的Activity启动流程和ANR原因,需要详细说明生命周期方法和启动模式,以及如何避免ANR。 现在需要确保每个部分都有引用支持,并且回答结构清晰,分点说明。可能还需要生成相关问题,比如优化ConstraintLayout性能、处理自定义View的尺寸模式等,这些问题要基于之前的引用和内容,确保用户能深入理解。 最后,检查数学格式是否正确,使用$...$和$$...$$,但看起来用户的问题中没有涉及数学公式,可能不需要。但如果有变量或代码,要正确格式化。同时,引用标识要自然添加在每个部分的末尾,例如提到ContentProvider时引用[1],内存泄漏检测引用[1]等。需要避免信息重复,确保每个技术点的解释简明扼要,同时覆盖用户提到的所有方面。可能用表格对比数据存储方式,用代码块展示OkHttp的使用,用列表说明生命周期阶段。回答完成后,生成的相关问题要针对每个技术点,帮助用户进一步学习。</think>### 一、Android UI设计与布局 1. **核心布局与优化** - **ConstraintLayout优势**:通过约束关系减少嵌套层级,提升渲染性能(引用[3]中提到的"计算一个view的嵌套层级"与此相关)[^3]。 - **性能优化**:避免过度使用`LinearLayout`嵌套,结合`merge`标签和`ViewStub`实现按需加载。 - **设计规范**:遵循Material Design,使用`Theme.AppCompat`统一UI风格[^2]。 2. **布局渲染机制** - **UI线程限制**:所有UI操作必须在主线程执行,但`ContentProvider`的查询操作默认在调用线程执行(如UI线程直接调用可能阻塞UI)[^1]。 - **异步加载**:大数据查询应通过`CursorLoader`在后台线程执行,避免ANR[^1]。 --- ### 二、自定义控件开发 1. **实现关键步骤** - **测量与绘制**:重写`onMeasure()`处理`wrap_content`和`match_parent`模式,结合$measureSpec$计算尺寸;在`onDraw()`中使用`Canvas`绘制内容[^3]。 - **事件处理**:通过`onTouchEvent()`和事件分发机制(引用[3]中的"View事件传递分发机制")实现交互逻辑[^3]。 2. **性能陷阱** - 避免在`onDraw()`中创建对象,防止频繁GC导致卡顿。 ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = resolveSize(mDefaultWidth, widthMeasureSpec); int height = resolveSize(mDefaultHeight, heightMeasureSpec); setMeasuredDimension(width, height); } ``` --- ### 三、Android数据存储 1. **存储方案对比** | 方式 | 适用场景 | 线程安全 | |------------------|----------------------------|-----------------------| | SharedPreferences| 简单配置存储 | 主线程直接读写可能阻塞 | | Room | 结构化数据 | 通过`@Dao`异步操作 | | ContentProvider | 跨应用数据共享 | 需结合`AsyncQueryHandler`[^1] | 2. **ContentProvider线程模型** - 默认在调用者线程执行,需自行管理线程切换,例如通过`AsyncTask`或协程[^1]。 --- ### 四、OOM处理与内存优化 1. **常见原因与解决方案** - **位图管理**:使用`BitmapFactory.Options.inSampleSize`压缩图片,结合`LruCache`缓存(默认缓存大小$maxMemory/8$)[^3]。 - **内存泄漏**:匿名内部类持有Activity引用(如未解绑的Handler),通过`LeakCanary`检测并修复[^3]。 2. **OOM处理边界** - OOM属于`Error`而非`Exception`,无法通过`try-catch`完全捕获,需提前预防。 --- ### 五、OkHttp网络请求与JSON解析 1. **OkHttp最佳实践** ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new HttpLoggingInterceptor()) .build(); Request request = new Request.Builder().url(API_ENDPOINT).build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { // 子线程处理响应 } }); ``` 2. **JSON解析** - 使用`Gson`或`Moshi`库实现对象映射,避免手动解析: ```java Gson gson = new Gson(); User user = gson.fromJson(jsonString, User.class); ``` --- ### 六、开源框架使用 1. **主流框架选择** | 框架 | 核心功能 | 优势 | |------------|-------------------------|------------------------------| | Retrofit | 声明式REST API调用 | 支持协程和RxJava | | Glide | 图片加载与管理 | 自动生命周期管理,防止内存泄漏 | | Hilt | 依赖注入 | 简化组件间依赖传递 | --- ### 七、Activity生命周期与启动模式 1. **生命周期关键阶段** - **可见生命周期**:`onStart()` → `onStop()` - **前台生命周期**:`onResume()` → `onPause()` - **数据保存**:使用`onSaveInstanceState()`保存临时数据,`ViewModel`保存配置无关数据[^3]。 2. **启动模式应用场景** - **singleTop**:防止重复创建栈顶Activity(如通知点击)。 - **singleTask**:用于应用主入口,确保唯一任务栈。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值