加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ImageView设置网络图片

(2023-06-26 17:31:31)
分类: androidios
    方案一:读取网络图片的inputStream,然后传给bitmap,再显示在imageView中,但是实际操作的时候,提示错误:android.os.NetworkOnMainThreadException(是因为现在网络请求不允许在主线程main中执行,要另外开辟一个子线程进行)
    下面是出错的将网络图片转成bitmap的方法

//将网络图片转换成bitmap
    public Bitmap getHttpBitmap(String url) {
        URL httpUrl = null;
        Bitmap bitmap = null;
        try {
            httpUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            conn.setConnectTimeout(6000);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            InputStream in = conn.getInputStream();//这行报错
            bitmap = BitmapFactory.decodeStream(in);
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this,"系统繁忙,请稍后再试",Toast.LENGTH_SHORT).show();
        }
        return bitmap;

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

下面是修改后的方法:直接开辟一个子线程,然后在里面设置网络图片,并在onCreate中调用该方法即可

public void setNetworkBitmap() {
        Runnable networkImg = new Runnable() {
            @Override
            public void run() {
                try {
                    URL httpUrl = new URL(getIntent().getStringExtra("QRCode"));
                    HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
                    conn.setConnectTimeout(6000);
                    conn.setDoInput(true);
                    conn.setUseCaches(false);
                    InputStream in = conn.getInputStream();
                    bitmap = BitmapFactory.decodeStream(in);
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(networkImg).start();
        while(bitmap == null)
            continue;
        QRImg.setImageBitmap(bitmap);
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

或者下面的代码也可以,更简洁点

public void setNetworkBitmap() {
        Runnable networkImg = new Runnable() {
            @Override
            public void run() {
                try {
                    URL conn = new URL(getIntent().getStringExtra("QRCode"));
                    InputStream in = conn.openConnection().getInputStream();
                    bitmap = BitmapFactory.decodeStream(in);
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(networkImg).start();
        while(bitmap == null)
            continue;
        QRImg.setImageBitmap(bitmap);
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    方案二:摘自stackoverflow
    http://stackoverflow.com/questions/2471935/how-to-load-an-imageview-by-url-in-android

private class DownloadImageTask extends AsyncTask {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new ;
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

然后在oncreate中执行下面的代码

new DownloadImageTask(QRImg).execute(getIntent().getStringExtra("QRCode"));
————————————————
版权声明:本文为CSDN博主「汤圆学Java」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jalon2015/article/details/53489446

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有