安卓学习-性能最佳实战

一.内存管理技巧

image

1.推介使用IntentService

image

image

image

image

image

image

image

image

image

7.直接用ArrayList 不用List

image

image

image

imageimage

image

 

二.高性能编码技巧

image

image

image

静态方法属于类,既可以通过类引用也可以通过创建对象来引用,

静态方法和非静态方法 都存放在代码区,静态方法是类方法,不用创建对象,直接拿来就用,而非静态方法是对象方法,

需要创建对象,然后用对象去访问。

静态方法可以直接用类名点出来方法,而普通方法需要创建类的对象后才能调用!
静态的方法和变量会调用时在内存生成一个唯一的标示,你可以理解成在物理内存中给静态一个位子,
这样的话在调用的时候可以直接找到,而且会节省内存,但是如果你声明的静态过多的话那么每一个都会在内存有一个位子,
那么你就没有资源运行别的,会报内存溢出!
普通方法是由java的gc机制(垃圾回收机制)来控制,可能同一个对象或变量在使用的过程中,这个时间的在内存占了一个位子,
而上个时间的还没有从内存中删除,这样的话就可能有2个一样的在内存中,这个2个一样东西只是内容值一样,但是内存值不一样,
你可以用"=="和"equals"来查看(这个只适用对象和String类型).java的gc机制会根据运行时的内存状态来自动清除一些用不到变量或对象,
就算你手动调用gc也是一样的!

image

image

image

image

image

image

image

image

10.成员变量存在堆中 本地变量存在栈中,访问栈比访问堆快

image

image

 

三.布局性能优化_hierarchyviewer工具与重用布局,ViewStub

image

image

能用RelativeLayout布局优化比LinearLayout更好,优化

image

image

image

image

image

image

imageimage

image

image

案例:

image点击标题栏image在点击标题栏image

实现ViewStub隐藏与显示

大家写项目的时候肯定会有一些东西提前写好,但是不到一定条件是不想让它显示出来的,我们可能的做法就是让它 View . GONE 或 View .INVISIBLE 等到一定条件了在代码里面这设置 View .VISIBLE 虽然这样写起来也挺方便的,也符合逻辑,但是这个条件是八百年都不出一次,你这么写就有点大才小用了,因为你事先布局好的Inflate, 也就是说 也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。

推荐的做法是使用 android.view.ViewStub ,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。

但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。

首先来说说ViewStub的一些特点:

1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。

2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

基于以上的特点,那么可以考虑使用ViewStub的情况有:

1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。

因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。

2. 想要控制显示与隐藏的是一个布局文件,而非某个View。

因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。

所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。

下面就说一个例子,这个例子是这样的,我们先用 ViewStub把xml布好,这显然不会被 Inflate,我们在代码让他显示出来,但是突然条件有不符合了,我必须把显示的东西还得把它隐藏掉,但是这个时候 ViewStub已经被销毁了,已经不能再用了,这个时候我们还得用GONE和VISIBLE来控制显示和隐藏。

image

title_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark">

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@mipmap/ic_launcher" />
</merge>

inc.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">



<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/button_back"
android:layout_alignParentTop="true"
android:text="返回" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="完成"
android:id="@+id/button_ok"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

item_layout2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width="71dp"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView_title"
android:layout_gravity="center_horizontal"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/imageView2"
android:layout_toEndOf="@+id/imageView2" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView2"
android:src="@mipmap/ic_launcher" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView_content"
android:layout_alignBottom="@+id/imageView2"
android:layout_toRightOf="@+id/imageView2"
android:layout_toEndOf="@+id/imageView2" />

</RelativeLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.hierarchyviewer.MainActivity">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark"
android:orientation="vertical">

<ViewStub
android:id="@+id/stub_import"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inflatedId="@+id/stub_import"
android:layout="@layout/inc"

/>

<include layout="@layout/title_bar"></include>
</LinearLayout>

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

MainActivity.java

package com.example.administrator.hierarchyviewer;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewStub;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ImageView imageView;
private ViewStub vs;
private boolean b=true;
private boolean a=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.imageView);
vs=(ViewStub)findViewById(R.id.stub_import);
imageView.setOnClickListener(this);
ListView lv=(ListView)findViewById(R.id.listView);
ArrayList<HashMap<String,String>> list=new ArrayList<>();
for (int i=1;i<20;i++)
{
HashMap<String,String> map=new HashMap<>();
map.put("title","title-"+i);
map.put("content","content-"+i);
list.add(map);
}
SimpleAdapter simpleAdapter=new
SimpleAdapter(this, list,R.layout.item_layout2 ,new String[]{"title","content"},new int[]{R.id.textView_title,R.id.textView_content});
lv.setAdapter(simpleAdapter);
}

@Override
public void onClick(View v) {
if (v.getId()==R.id.imageView)
{
//可见
// vs.setVisibility(View.VISIBLE);
//或者
// View v=vs.inflate();
if(b){//条件符合 显示布局
vs.inflate();
b=false;
}else{
if(a){//条件不符合 这个viewStub已经回收了所以我们只能用GONE和VISIBLE
vs.setVisibility(View.GONE);
a=false;
}else{//条件符合
vs.setVisibility(View.VISIBLE);
a=true;
}

}
}
}
}

转载于:https://my.oschina.net/xiaofeiandroid/blog/659039

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值