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

Android:多线程下载网络图片

3.12 网络图片操作

1、通过URL请求获取网络图片

示例:

创建t_picture.xml,页面layout布局文件,一个Button按钮和一个ImageView容器显示图片。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <Button

        android:id="@+id/btn_show"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:textSize="30dp"

        android:text="图片显示">

    </Button>

    <ImageView

        android:id="@+id/iv1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content">

    </ImageView>

</LinearLayout>

创建WebPictureActivity继承Activity,页面对应的Activity文件。loadWebPicture:加载网络图片,注意需要在新的Thread调用网络请求。

创建URL类对象;

调用URL的openConnection方法获取连接HttpURLConnection类对象connection;

调用connection对象的getInputStream获取输入流;

调用类BitmapFactory的decodeStream方法,通过输入流创建位图。

注意:

1、进行Https请求时,报错:javax.net.ssl.SSLHandshakeException,创建handleSSLHandshake方法,在onCreate方法中调用。

//报错:javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found

//Https请求的验证证书不支持,所有证书验证通过

public static void handleSSLHandshake(){

    TrustManager[] trustManagers=new TrustManager[]{

        new 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[0];

            }

        }

    };

    try {

        SSLContext sslContext=SSLContext.getInstance("TLS");

        //信任所有证书

        sslContext.init(null,trustManagers,new SecureRandom());

        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

            @Override

            public boolean verify(String hostname, SSLSession session) {

                //任何hostname都验证通过

                return true;

            }

        });

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    } catch (KeyManagementException e) {

        e.printStackTrace();

    }

}

2、进行Http请求时,报错:Cleartext HTTP traffic to img.pconline.com.cn not permitted,可以配置运行Http请求。

在res中创建xml文件夹,创建network_security_config.xml文件

<?xml version="1.0" encoding="utf-8"?>

<!--允许进行http网络请求

在mainfests中配置application属性值

    android:networkSecurityConfig="@xml/network_security_config"

-->

<network-security-config>

    <base-config cleartextTrafficPermitted="true" />

</network-security-config>
在AndroidManifest.xml配置application属性networkSecurityConfig
android:networkSecurityConfig="@xml/network_security_config"

3、网络请求需要在AndroidManifest.xml配置permission。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

完整代码:

public class WebPictureActivity extends Activity {

    private Context mContext;

    private ImageView imageView;

    private Button button;

    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.t_picture);

        //设置上下文

        mContext=WebPictureActivity.this;

        //获取ImageView

        imageView = findViewById(R.id.iv1);

        //获取按钮

        button = findViewById(R.id.btn_show);

        //设置按钮点击响应

        button.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                //创建进程

                Th

http://www.kler.cn/a/229997.html

相关文章:

  • 【VUE3】新版Vue3+ElementPlus全家桶开发视频项目实战
  • 数据结构(Java版)第四期:ArrayLIst和顺序表(上)
  • DAMODEL丹摩 | 关于我部署与使用FLUX.1+ComfyUI生成了一位三只手的jk美少女这回事
  • 【Linux庖丁解牛】—软件安装vim!
  • Leetcode494. 目标和(HOT100)
  • testImplementation和androidTestImplementation区别
  • IntelliJ IDE 插件开发 | (六)内部模式的使用
  • 2024/2/6
  • JS实现一键复制、选中复制、选中多行复制
  • 确定问卷调查样本量
  • C遗漏知识(个人向)
  • 【FPGA】高云FPGA之IP核的使用->PLL锁相环
  • 解决C#中无限递归导致的System.StackOverflowException异常
  • 通过无线打通两个路由器
  • React 错误边界组件 react-error-boundary 源码解析
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • ubuntu22.04 安装部署01:禁用内核更新
  • N-143基于springboot博客系统
  • Java学习笔记2024/2/5
  • arch linux python venv
  • 使用MATLAB驱动USRP-N320实现OFDM自收自发
  • 112 C++ STL 函数对象回顾,系统函数对象以及范例
  • 微服务限流(漏桶算法、令牌桶算法)
  • 时间序列(Time-Series)FourierCorrelation.py代码解析
  • MongoDB 字段中数据类型不一致序列化异常排查与处理
  • 20240206在WIN10下下载安装RX580的驱动程序