本文内容

  • 环境
  • 演示

下载 Demo

环境


  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.3
  • SAMSUNG GT-I9008L,Android OS 2.2.2

演示


缩略图能减少手机内存的消耗。网络上的资源一般对手机来说,大了点,把图片解码,减少其尺寸,从而减少手机内存的消耗。

本文采用的歌曲列表是 Android_Music_Demo_json_h_array.xml 文件,虽然文件后缀名是 .xml,但内部其实是 JSON 格式,因为 cnblog 不让上传 .json 格式的文件,该文件里的缩略图都较大,是 .jpg 格式,而与之对应的 Android_Music_Demo_json_array.xml 文件里的缩略图,都很小,都是才不到10k的 .png 格式。

device-2014-07-10-151737

图 1

假设给定一个图片链接地址,想获得图片缩略图,核心代码如下所示,点击此处下载:

private Bitmap getBitmap(String url) {
        File f = fileCache.getFile(url);
    
        // from SD cache
        Bitmap b = decodeFile(f);
        if (b != null)
            return b;
    
        // from web
        try {
            Bitmap bitmap = null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) imageUrl
                    .openConnection();
    
            conn.setRequestMethod("GET");
            // Sets the flag indicating whether this URLConnection allows input.
            // conn.setDoInput(true);
            conn.setConnectTimeout(3000);
            conn.setReadTimeout(3000);
            // Flag to define whether the protocol will automatically follow
            // redirects or not.
            conn.setInstanceFollowRedirects(true);
            int response_code = conn.getResponseCode();
            if (response_code == 200) {
                InputStream is = conn.getInputStream();
                OutputStream os = new FileOutputStream(f);
                StreamUtils.CopyStream(is, os);
                os.close();
                conn.disconnect();
                bitmap = decodeFile(f);
                return bitmap;
            } else {
                conn.disconnect();
                return null;
            }
    
        } catch (Throwable ex) {
            ex.printStackTrace();
            if (ex instanceof OutOfMemoryError)
                memoryCache.clear();
            return null;
        }
    }
private Bitmap decodeFile(File f) {
        try {
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            FileInputStream stream1 = new FileInputStream(f);
            BitmapFactory.decodeStream(stream1, null, o);
            stream1.close();
    
            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }
    
            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            FileInputStream stream2 = new FileInputStream(f);
            Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
            stream2.close();
            return bitmap;
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

下载 Demo

更多相关文章

  1. Android 打开本地pdf文件,android 加载pdf文件
  2. Android Manifest文件
  3. Android 中.aar文件生成方法与用法
  4. Android文件存取
  5. Android初始化语言 (init.*.rc、init.conf文件格式)
  6. Android 模拟器安装apk文件
  7. android使用WebView显示sdcard的html文件
  8. 003.android资源文件剖析(Resources)

随机推荐

  1. Android即时消息介绍
  2. 在eclipse中查看android SDK的源代码
  3. Android(安卓)模拟器创建参数说明
  4. Android(安卓)Studio初探:不只是一个简单
  5. 开发Android应用 提升性能的小技巧
  6. 如何在Android和iOS设备上录制游戏?
  7. 记录一下八款开源 Android(安卓)游戏引擎
  8. android上各个浏览器的内核信息对比
  9. android Java 笔试考题
  10. Android扫描条形码实现