1要懂得删除无用的控件跟层级,有选择性的使用消耗性能较的ViewGroup,如LinearLayout,FrameLayout,RelativityLayout(功能较复杂,它的布局过程需要消耗更多的CPU时间)。
2.多采用include标签,merge标签,ViewStub。
Include标签:用于布局重用。
Merge标签:可减少布局的层级。
ViewStub:按需加载,当需要viewstub时才将布局加载到内存。
Include标签只支持android:layout_开头的属性,其它属性不支持,当其指定了android:layout_*这些属性后,必须为其指定android:layout_width,android:layout_height,否则android:layout_*这类属性无效。
Merge 标签一般跟include标签一起使用如:
layout.xml
<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
</LinearLayout>
在对应布局中使用:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/layout"/>
</LinearLayout>
其中 include标签中的布局根层级是一个垂直的LinearLayout,而包裹include标签的上一层布局也是垂直的LinearLayout,所以可以用merge标签减速布局层数。更改如下:
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="Item"
/>
</merge>
ViewStub 是非常轻量级的宽高都为0的view,本身不参与任何布局及绘制过程。
<ViewStub
android:id="@+id/viewstub"
android:layout="@layout/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
显示Viewstub
viewStub.setVisibility(View.VISIBLE);
在自定义view时,应避免在onDraw方法中执行大量操作,因为onDraw方法可能会被大量调用。
如:
public class YouhuaActivity extendsActivity {
staticContext context;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_youhua);
context=this;
}
}
属性动画中有一类无限循环的动画,若在Activity的onDestory中没有去停止该动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画。将会导致以下问题,播放动画的view被动画持有,而view有持有了Activity,最终Activity无法释放。解决办法是在Activity的onDestory方法中停止动画(animator.cancle())。
主要在adapter中getView方法进行优化。
@Override
public View getView(int position, ViewconvertView, ViewGroup parent)
{
if(convertView==null)
{
convertView= minflater.inflate(R.layout.item_task_listview, parent, false);
ViewHolderholder=new ViewHolder(convertView);
convertView.setTag(holder);
}
ViewHolderholder=(ViewHolder) convertView.getTag();
initDate(position,holder);
returnconvertView;
}
public void initDate(intposition,ViewHolder holder)
{
TaskPoliceBeantb =mlists.get(position);
holder.taskName.setText(tb.taskName);
holder.crimeAddr.setText(tb.crimeAddr);
holder.deliveryTime.setText(tb.deliveryTime);
}
private static class ViewHolder{
@ViewInject(R.id.taskName)
TextViewtaskName;
@ViewInject(R.id.crimeAddr)
TextViewcrimeAddr;
@ViewInject(R.id.deliveryTime)
TextViewdeliveryTime;
publicViewHolder(View convertView) {
super();
ViewUtils.inject(this,convertView);
}
}
参考bitmap的高效加载。
采用线程池,避免程序中存在大量的线程。因为线程池可以重用内部的线程,从而避免了线程创建跟销毁所带来的性能的消耗。同时线程池能有效的控制线程的最大并发数,避免大量线程因相互抢占系统资源从而导致阻塞现象发生。
1. 常量使用static final来修饰
2. 多使用Android特有的数据结构,如SparseArray,Pair,因为它们有更好的性能。
3. 适当使用软应用和弱引用。
4. 使用内部类时,尽量采用静态内部类,可以避免由于内部类而导致的内存泄漏。
推荐使用内存泄漏工具来分析内存使用情况(MAT 工具 Eclipse Memory Analyzer)
下载地址:http://www.eclipse.org/mat/downloads.php