内部类的Android安全与不安全使用

时间:2015-09-20 22:15:22

标签: java android memory memory-leaks

我是Android开发的新手,我一直在寻找确保我的应用程序不会泄漏内存的方法。我在网上读过,使用内部类会导致内存泄漏,特别是当它们可能比它们的Activity活动时更长。以下是我使用的一些内部类。其中哪些(如果有的话)可能导致内存泄漏?

public class TitleScreenActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_title_screen);
    final MyHandler mHandler = new MyHandler(this);
    final Intent intent = new Intent(mHandler.mActivity.get(), IntroActivity.class);
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startActivity(intent);
            mHandler.mActivity.get().finish();
        }
    }, 2000);
}

private static class MyHandler extends Handler {
    public final WeakReference<TitleScreenActivity> mActivity;

    public MyHandler(TitleScreenActivity activity) {
        mActivity = new WeakReference<>(activity);
    }
}
}

我的代码基于this article中的代码。但是,我不认为我可以使我的Runnable静态,就像他们在文章中所做的那样。即使我在runnable中完成了Activity,这段代码是否会导致内存泄漏?

另一个例子:

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage(R.string.no_tiles);
            builder.setPositiveButton(R.string.store, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // start new Activity
                }
            });
            builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // Do nothing, just close dialog
                }
            });
            AlertDialog dialog = builder.create();
            dialog.show();

我很难相信这可能会导致泄漏,因为它不包含对Activity,View等的显式引用,并且(据我所知)当用户单击按钮时对话框被销毁,所以听众也会被摧毁。但是,我想确定一下。

最后一个例子:

        TranslateAnimation translate;
        translate = new TranslateAnimation(0, 0, 0, 100);
        translate.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // modify a few variables
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        translate.setDuration(200);
        findViewById(R.id.game_board).startAnimation(translate);

我不确定这是否会导致,因为从理论上讲,动画可以比活动中的活动更长。

感谢所有帮助,谢谢!

0 个答案:

没有答案