zoukankan      html  css  js  c++  java
  • Android 下载网络图片注意的问题

    在使用的过程中,如果网络比较慢的话,则会出现下载不成功的问题。经过google搜索,终于解决了这个问题。

      一般我们会用以下的代码:

    java代码:
    //获取connection,方法略
    conn = getURLConnection(url);
    is = conn.getInputStream();

    //获取Bitmap的引用
    Bitmap bitmap = BitmapFactory.decodeStream(is)


           但是网络不好的时候获取不了图片,推荐使用以下的方法:

    java代码:
    //获取长度
    int length = (int) conn.getContentLength();
    if (length != -1) {
    byte[] imgData = new byte[length];
    byte[] temp=new byte[512];
    int readLen=0;
    int destPos=0;

    while((readLen=is.read(temp))>0){
    System.arraycopy(temp, 0, imgData, destPos, readLen);
    destPos+=readLen;
    }

    bitmap=BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
    }


            使用上面的方法的好处是在网速不好的情况下也会将图片数据全部下载,然后在进行解码,生成图片对象的引用,所以可以保证只要图片存在都可以下载下来。当然在读取图片数据的时候也可用java.nio.ByteBuffer,这样在读取数据前就不用知道图片数据的长度也就是图片的大小了,避免了有时候 http获取的length不准确,并且不用做数组的copy工作。

    java代码:
    public synchronized Bitmap getBitMap(Context c, String url) {
    URL myFileUrl = null;
    Bitmap bitmap = null;
    try {

    myFileUrl = new URL(url);
    } catch (MalformedURLException e) {
    bitmap = BitmapFactory.decodeResource(c.getResources(),
    com.jixuzou.moko.R.drawable.defaultimg);
    return bitmap;
    }

    try {
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream is = conn.getInputStream();
    int length = (int) conn.getContentLength();
    if (length != -1) {
    byte[] imgData = new byte[length];
    byte[] temp = new byte[512];
    int readLen = 0;
    int destPos = 0;
    while ((readLen = is.read(temp)) > 0) {
    System.arraycopy(temp, 0, imgData, destPos, readLen);
    destPos += readLen;
    }
    bitmap = BitmapFactory.decodeByteArray(imgData, 0,imgData.length);
    }
    } catch (IOException e) {
    bitmap = BitmapFactory.decodeResource(c.getResources(),com.jixuzou.moko.R.drawable.defaultimg);
    return bitmap;
    }
    return bitmap;
    }

  • 相关阅读:
    【Teradata】DSA服务器tdactivemq重启清理消息队列步骤
    什么是5G
    【时序数据库】十分钟系列
    16_Android的数据存储_ SharedPreference、XML和JSON
    15_Android文件读写操作
    14_TTS
    13_拍照、录像和音频
    12_Sensor简单实例
    11_SurfaceView绘图
    10_多点触摸交互处理
  • 原文地址:https://www.cnblogs.com/xxz526/p/3683229.html
Copyright © 2011-2022 走看看