Android基础概述(一)

1.  listview优化问题

>1. 复用convertView:避免在内存中累积大量选项View对象。

example:

                   Viewview;

                            if(convertView==null){

                                 view=inflater.inflate(intresource,ViewGroup root);

                                 ......

                            }else{

                                 view=convertView;

                                 ......

                            }

>2.使用ViewHolder,保存控件:避免多次从row中通过findViewById来找子控件。

example:

                            Viewview;

                            ViewHolderholder;

                            if(convertView==null){

                                 view=inflater.inflate(intresource,ViewGroup root);

                                 holder=new ViewHolder ();

                                 holder.tv=(TextView) view.findViewById(R.id.tv);

                                 view.setTag(holder);

                            }else{

                                 view=convertView;

                                 holder=view.getTag();

                            }

                            classViewHolder{

                                  TextView tv;

                            }

>3. 分页处理:避免一次性把所用数据都加载到ListView上。

》加载图片:

>4. (1)通过线程来异步加载图片,把Http的相关操作放在线程里(最好使用线程池来控制线程数)。返回的bitmap通过Handler来更新每个Item布局上的ImageView。及时动态回收bitmap,方法:bitmap.recycle();

(2)展示高分辨率的图片时,先将图片进行压缩至与空间大小相近。

附上一个连接:http://www.2cto.com/kf/201503/383031.html(有代码实例)

2.  Android布局适配不同机型

>1 合理使用wrap_content,match_parent

>2 尽可能的使用 RelativeLayout(结合weight)

>3 针对不同的机型,使用不同的布局文件(UseSize Qualifiers):

res/layout/main.xml

res/layout-large/main.xml

>4 尽量使用点9图片(UseNine-patch Bitmaps)

3.  OOM问题

>1.避免对activity的超过生命周期的引用(尽量使用application代替activity)。

程序一般是由很多个Activity构成的,从一个Activity跳转了以后,系统就有可能回收这个Activity的各种内存占用。可是此时如果你的一些不可回收变量(比如静态变量)保持了对此Activity对象的引用,那么GC就不会对此Activity进行回收,无故占用了大量的内存。这种情况最好的办法就是用application代替activity。用Context.getApplicationContext() 或者Activity.getApplication()可以很方便的得到application对象;

>2.在展示高分辨率图片时,先将图片进行压缩到与空间大小相近(可避免图片过大页面之间切换出现oom);

>3.及时释放不使用的Bitmap,动态回收内存,方法:bitmap.recycle();

>4.对适配器视图进行优化处理,避免过多加载数据和对象的生成;

>5.对数据库进行查询时,如使用了cursor,需及时关闭。

4. service与activity的区别

》从设计角度

         Activity主要用于程序与用户的交互,service运行与后台,没有界面呈现;组件不会独立的运行于进程或者线程中,需在主线程中运行,当执行比较耗时或者阻塞操作,则需在子线程操作,否则会无法响应用户的操作。

附上一个链接:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html(四大组件详解)

》从使用角度

>1.对intent

Service可以与activity进行双向连接,也可单独接受intent的请求

>2.生命周期

两种不同的方式启动service,service的生命周期不同

5.  onSaveInstanceState()方法适合保存什么数据

由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等.

6. ANR  问题(引用总结)

         产生原因:主线程中做了非常耗时的操作

         》在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)

》BroadcastReceiver在10秒内没有执行完毕

避免方法:

>1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等) 

>2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点) 

>3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。 

总结:ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值