- 由于我们程序的失误,长期保持某些资源(如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();
- }