当前位置:  编程技术>移动开发
本页文章导读:
    ▪您要是也想这样享受,你也得努力        你要是也想这样享受,你也得努力 你要是也想这样享受,你也得努力 ......
    ▪ 内存溢出的解决方法        内存溢出的解决办法 昨天在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。       模拟器RAM比较小,只有8M内存,当我放.........
    ▪ Bit地图类 相关学习       Bitmap类 相关学习 private static class SampleView extends View {         private Bitmap mBitmap;         private Bitmap mBitmap2;         private Bitmap mBitmap3;         private Shader mShader;                .........

[1]您要是也想这样享受,你也得努力
    来源: 互联网  发布时间: 2014-02-18
你要是也想这样享受,你也得努力
你要是也想这样享受,你也得努力

    
[2] 内存溢出的解决方法
    来源: 互联网  发布时间: 2014-02-18
内存溢出的解决办法

昨天在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。
      模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:

//解决加载图片 内存溢出的问题
                    //Options 只保存图片尺寸大小,不保存图片到内存
                BitmapFactory.Options opts = new BitmapFactory.Options();
                //缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰
                opts.inSampleSize = 4;
                Bitmap bmp = null;
                bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);                             
                ...              
               //回收
                bmp.recycle();

通过上面的方式解决了,但是这并不是最完美的解决方式。

通过一些了解,得知如下:

优化Dalvik虚拟机的堆内存分配

对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体 原理我们可以参考开源工程,这里我们仅说下使用方法:   private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

Android堆内存也可自己定义大小

    对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对 性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理

另外通过国外某网站的解决办法是,通过调用setImageUri()方法来导入图片的URI,这种方式待研究,下次在说

1 楼 xtcpcgx 2010-08-23  
学习啦,收藏一下。

    
[3] Bit地图类 相关学习
    来源: 互联网  发布时间: 2014-02-18
Bitmap类 相关学习

private static class SampleView extends View {
        private Bitmap mBitmap;
        private Bitmap mBitmap2;
        private Bitmap mBitmap3;
        private Shader mShader;
      
        private static void drawIntoBitmap(Bitmap bm) {
            float x = bm.getWidth();
            float y = bm.getHeight();
            Canvas c = new Canvas(bm);
            Paint p = new Paint();
            /* Paint类的一个边缘光滑的方法,true表示边缘光滑*/
            p.setAntiAlias(true);
           
            p.setAlpha(0x80);/设置颜色透明度为十六进制80(半透明),0x00全透明,0xFF不透明
            /*在位图矩阵区域内画一个相切的圆*/
            c.drawCircle(x/2, y/2, x/2, p);
            p.setAlpha(0x30);
       /*用指定的PorterDuff模型创建xformode,PorterDuff.Mode.SRC
             * 表示下面要绘制的文本应在上面绘制的圆的上层
             */
     p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
            p.setTextSize(60);
            /*Paint.Align 是文本对齐方式的一个枚举类
             * CENTER表示文本居中
             * LEFT 表示做对齐
             * RIGHT 表示右对齐
             */
            p.setTextAlign(Paint.Align.CENTER);
      /*FontMetrics是字体度量的类描述了给定文本大小的各种各样的字体度量。
             * ascent 表示到基准线之上的距离
             * bottom 表示到基准线之下的最大距离,它是最低的字体类型
             * descent 表示到基准线之下的距离
             * leading 空格字符到基准线的距离,为0
             * */
            Paint.FontMetrics fm = p.getFontMetrics();
            c.drawText("Alpha", x/2, (y-fm.ascent)/2, p);
        }
      
        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            /*取得资源文件的输入流*/
            InputStream is = context.getResources()
          .openRawResource(R.drawable.app_sample_code);
            /*BitmapFactory 是位图的一个工厂类
             * 从各种各样的位图对象中创建位图对象,包括文件,流,字节数组。
             * */
            mBitmap = BitmapFactory.decodeStream(is);
            /*extractAlpha()位图的这个方法是通过提取
             * 了原始位图的透明通道值重建新的位图*/
            mBitmap2 = mBitmap.extractAlpha();
            /*通过位图的宽度和高度已经位图的颜色配置来创建位图
             * Bitmap.Config是内部枚举类表示位图的颜色配置
             * 它的颜色配置有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565
             * */
mBitmap3 = Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8);
            drawIntoBitmap(mBitmap3);
  /*LinearGradient类是Shader的一个子类,它实现的是一个线性梯度变化的一个
   * 着色器,(0,0)到(100,70)的直线式颜色梯度变化线
   * 这个梯度变化是在红绿蓝之间均匀变化的
   * Shader.TileMode是超出梯度线的颜色变化模式
*CLAMP 固定shader绘画时颜色超过原始边界(梯度线)的部分颜色用边界颜色绘制。
   *REPEAT 在水平和垂直方向重复使用着色器的色相,但边界分明
   *MIRROR 在水平和垂直方向重复使用着色器的色相,交换的映像色相使得邻
   *近的色相总是一致;颜色关于梯度线镜像
   * */
mShader = new LinearGradient(0, 0, 100, 70,
new int[] {Color.RED, Color.GREEN, Color.BLUE },
                null, Shader.TileMode.MIRROR);
  }
      
        @Override protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            Paint p = new Paint();
            float y = 10;
            /*设置画笔颜色为红色*/
            p.setColor(Color.RED);
        /*调用画布的drawBitmap方法在指定的位置用指定的画笔画指定的位图*/
            canvas.drawBitmap(mBitmap, 10, y, p);
            /*设置下一个位图绘制的y坐标值*/
            y += mBitmap.getHeight() + 10;
            canvas.drawBitmap(mBitmap2, 10, y, p);
            y += mBitmap2.getHeight() + 10;
            /*设置画笔的着色器*/
            p.setShader(mShader);
            canvas.drawBitmap(mBitmap3, 10, y, p);
            /*这个类主要装载了绘制直线曲线等的几何路径。*/
            Path path = new Path();
            /*画上面的梯度变化线*/
            path.moveTo(0, 0);
            path.lineTo(100,70);
            p.setColor(Color.RED);
            /*Paint.Style画刷的样式枚举类
             * STROKE 只绘制笔画形状
             * Fill 填充
             * FILL_AND_STROKE 既画笔画又填充
             * */
            p.setStyle(Paint.Style.STROKE);
            /*用指定的路径和指定的画刷画要求的路径*/
            canvas.drawPath(path, p);
        }
    }
}


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3