解决android开发中内存溢出之软引用(SoftReference)

来源:互联网 发布:matlab矩阵qr分解 编辑:程序博客网 时间:2024/06/06 12:42

解决android开发中内存溢出之软引用(SoftReference)

在android程序开发过程中,可能会有很多人会和我一样,因为内存溢出而感觉到苦恼,因为本身引用是个很多很多(基本就是个看网络美女图片的软件,哈哈),大家都知道android对于每个应用分配的内存是有限制的,不同机型对于一个应用可用系统的多少内存也大不相同,所以开始做应用的时候并没有考虑这些,所以后来痛苦了好久,现在和大家分享一些关于让你的程序稳定程度加一成保障的做法,那就是在程序中SoftReference的使用,可能大家并没有确切的去做过这个软引用的实际使用与不使用的对比,今天闲着没事做了个实验
本人也是个菜鸟,如果有错误的地方请高手指出!!!
因为不知道更好的参考内存变化的方法,所以只有借助eclipse的DDMS了 
下面我来解释下自己的做法
1、开启了一个线程,在线程中不停的创建对象,就是new byte[512]  这样去模拟内存的使用
2、在代码中普通强引用的直接存放,和软引用使用的存放
结果,普通存放,根据我测试机的内存 new byte[512] 强引用我也就能执行3-5秒,而软引用大概会超过1分钟的时间,下面把代码给贴出
首先 
public final class TestFragment extends Fragment implements OnClickListener {private static final String KEY_CONTENT = "TestFragment:Content";Handler h = new Handler(){@Overridepublic void handleMessage(Message msg) {outMem();super.handleMessage(msg);}};public static TestFragment newInstance(String content) {TestFragment fragment = new TestFragment();fragment.mContent = content;return fragment;}private TextView page1_text;private Button page1_btn;private Spinner spinner;private int sppos;private List<Temp> content = new ArrayList<Temp>();private List<BitmapSoftR> content1 = new ArrayList<BitmapSoftR>();Timer timer = new Timer();/** * 因为没有新建工程,这个是在做一个Fragment的demo程序 所以下面是onCreateView,其实和activity没太大的区别 */@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)){mContent = savedInstanceState.getString(KEY_CONTENT);}View rlayout = inflater.inflate(R.layout.soft_reference, container, false);page1_text = (TextView) rlayout.findViewById(R.id.page1_text);page1_btn = (Button) rlayout.findViewById(R.id.page1_button);page1_btn.setOnClickListener(this);spinner = (Spinner) rlayout.findViewById(R.id.check_model);spinner.setPrompt(getResources().getString(R.string.plase_check_model));final String[] items = getResources().getStringArray(R.array.check_model);ArrayAdapter<String> array_adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, items);array_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner.setAdapter(array_adapter);spinner.setSelection(0, true);spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view,int pos, long id) {sppos = pos;}public void onNothingSelected(AdapterView<?> arg0) {}});return rlayout;}@Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString(KEY_CONTENT, mContent);} //定时通知UI更新 每间隔5秒更新一次TimerTask task = new TimerTask(){                public void run() {                Message message = new Message();                    h.sendMessage(message);              }                    };        @Overridepublic void onClick(View v) {switch (v.getId()){case R.id.page1_button:new Thread(new SoftThread(sppos)).start();//开启不停new内存的线程if (timer != null)timer.schedule(task, 1000, 5000); //一个计时任务,本来是打算在UI上打印出当前程序内存使用的请款,可是程序最后都是要崩掉的,所以意义不太大break;default:break;}}//在点击测试button的时候开启此线程class SoftThread implements Runnable{int value;public SoftThread(int s){this.value = s;//将当前选中的选择框的pos传递过来,判断是用那种模式}@Overridepublic void run() {Temp ta;switch (value){case 0://使用软引用,在list中存放的软引用对象while(true){ta = new Temp();BitmapSoftR br = new BitmapSoftR(ta);content1.add(br);}case 1://list中群芳的是强引用while(true){ta = new Temp();content.add(ta);}case 2://等同于强引用while(true){ta = new Temp();BitmapSoftR br = new BitmapSoftR(ta);content.add(br.get());}default:break;}}}class Temp {byte[]  b = new byte[512];//每次都会在内存分配这么大的空间}//软引用class BitmapSoftR extends SoftReference<Temp> {public BitmapSoftR(Temp r){super(r);}}//打印运行时内存public void outMem(){page1_text.setText(page1_text.getText() + "\n" + "整个程序的内存总数 :" + Runtime.getRuntime().totalMemory() + "\n"+ "可用内存总数 : " + Runtime.getRuntime().freeMemory() + "\n"+ "最大内存量 : " + Runtime.getRuntime().maxMemory() + "\n"+"-------------------------------------");}}
下面把原码重新整理了,弄了一个单独的工程
下载地址:http://download.csdn.net/download/eye_hello/4549813
原创粉丝点击