Android,谁动了我的内存
来源:互联网 发布:mac把程序放到桌面 编辑:程序博客网 时间:2024/06/10 05:45
- 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。
- 保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。
- public class ClassName {
- private static Context mContext;
- //省略
- }
- private static Drawable sBackground;
- @Override
- protected void onCreate(Bundle state) {
- super.onCreate(state);
- TextView label = new TextView(this);
- label.setText("Leaks are bad");
- if (sBackground == null) {
- sBackground = getDrawable(R.drawable.large_bitmap);
- }
- label.setBackgroundDrawable(sBackground);
- setContentView(label);
- }
- public class MyActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- new MyThread().start();
- }
- private class MyThread extends Thread{
- @Override
- public void run() {
- super.run();
- //do somthing
- }
- }
- }
- public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends
- AsyncTask<Params, Progress, Result> {
- protected WeakReference<WeakTarget> mTarget;
- public WeakAsyncTask(WeakTarget target) {
- mTarget = new WeakReference<WeakTarget>(target);
- }
- /** {@inheritDoc} */
- @Override
- protected final void onPreExecute() {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- this.onPreExecute(target);
- }
- }
- /** {@inheritDoc} */
- @Override
- protected final Result doInBackground(Params... params) {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- return this.doInBackground(target, params);
- } else {
- return null;
- }
- }
- /** {@inheritDoc} */
- @Override
- protected final void onPostExecute(Result result) {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- this.onPostExecute(target, result);
- }
- }
- protected void onPreExecute(WeakTarget target) {
- // No default action
- }
- protected abstract Result doInBackground(WeakTarget target, Params... params);
- protected void onPostExecute(WeakTarget target, Result result) {
- // No default action
- }
- }
事实上,线程的问题并不仅仅在于内存泄露,还会带来一些灾难性的问题。由于本文讨论的是内存问题,所以在此不做讨论。
- private ImageView preview;
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
- Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
- preview.setImageBitmap(bitmap);
- /**本例子为博主随手一写,来说明用法,并未验证*/
- private class MyAdapter extends BaseAdapter {
- private ArrayList<SoftReference<Bitmap>> mBitmapRefs = new ArrayList<SoftReference<Bitmap>>();
- private ArrayList<Value> mValues;
- private Context mContext;
- private LayoutInflater mInflater;
- MyAdapter(Context context, ArrayList<Value> values) {
- mContext = context;
- mValues = values;
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- public int getCount() {
- return mValues.size();
- }
- public Object getItem(int i) {
- return mValues.get(i);
- }
- public long getItemId(int i) {
- return i;
- }
- public View getView(int i, View view, ViewGroup viewGroup) {
- View newView = null;
- if(view != null) {
- newView = view;
- } else {
- newView =(View)mInflater.inflate(R.layout.image_view, false);
- }
- Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName);
- mBitmapRefs.add(new SoftReference<Bitmap>(bitmap)); //此处加入ArrayList
- ((ImageView)newView).setImageBitmap(bitmap);
- return newView;
- }
- }
- Cursor cursor = null;
- try {
- cursor = mContext.getContentResolver().query(uri,null, null,null,null);
- if(cursor != null) {
- cursor.moveToFirst();
- //do something
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- @Override
- protected void onDestroy() {
- if (mAdapter != null && mAdapter.getCurosr() != null) {
- mAdapter.getCursor().close();
- }
- super.onDestroy();
- }
0 0
- Android,谁动了我的内存
- Android,谁动了我的内存
- Android,谁动了我的内存
- Android,谁动了我的内存
- Android,谁动了我的内存
- android谁动了我的内存
- Android谁动了我的内存
- Android, 谁动了我的内存 ?
- Android,谁动了我的内存
- Android,谁动了我的内存
- [Android 实例教程] Android,谁动了我的内存
- Android,谁动了我的内存(1)
- Android,谁动了我的内存(2)
- Android,谁动了我的内存(1)
- Android,谁动了我的内存(2)
- Android,谁动了我的内存(转)
- Android,谁动了我的内存(1)
- Android,谁动了我的内存(2) .
- poj-1836-Alignment-动态规划
- 基于Maven的Spring + Spring MVC + Mybatis的环境搭建
- Android IM(三)会议室创建、加入以及查询会议室中所有成员
- Linux文件权限
- [LeedCode OJ]#189 Rotate Array
- Android,谁动了我的内存
- 创建对象
- POJ 1837 Balance(01背包)
- 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)
- 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
- Redis cluster基础介绍
- ORACLE sql 判断字段中某个字符出现次数
- 第23章 Spring的Web框架
- Oracle内对MongoDB的INT64数据转换