使用上下文从自定义视图完成活动

use*_*016 5 java eclipse android

这是我的代码:

    private void makeDialog2() {
    AlertDialog.Builder about = new AlertDialog.Builder(getContext());
    about.setTitle("You Won!");

    about.setPositiveButton("Play Again",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    Intent playIntent2 = new Intent(getContext(),
                            PracticePlayActivity.class);
                    playIntent2.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    getContext().startActivity(playIntent2);
                    ((Activity) getContext()).finish();
                }
            });

    about.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg1, int arg2) {
            Intent playIntent = new Intent(getContext(),
                    PlayChooserActivity.class);
            playIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            getContext().startActivity(playIntent);
            ((Activity) getContext()).finish();
        }
    });

    about.show();
}
Run Code Online (Sandbox Code Playgroud)

当用户输掉游戏并想要重试时,会提示此代码.但是当我按下重试次数超过4次时,应用程序崩溃了.我怀疑是内存泄漏.在logcat中进行一些测试后,我设法在重试后发现活动仍在运行.

我的计划是用两件事来解决这个问题.回收我的drawables并结束整个第一个活动.但是,即使在我打完成后,第一个活动也没有关闭.有帮助吗?(在我的代码的其他部分使用getContext()到目前为止已经工作).

编辑:通过结束活动它会自动销毁变量吗?还是我还需要清除Android内存中的位图?我有什么想法可以做到这一点?

kas*_*rch 9

如果makeDialog2()Activitytry中声明使用thisYourActivityName.this代替getContext().如果不是,则尝试Context使用thisYourActivityName.this从调用方法的位置将方法作为参数传递给方法.

通过结束活动它会自动销毁变量吗?

完成一个Activity应该破坏它和所有相关资源.如果您启动Activity后者的新实例,它将重新创建其所有资源.除非你使用某种静态变量 - 只要你的应用程序运行,它们就会保持"活着".


调用此方法的地方实际上是surfaceview,因此我给它的任何参数基本上仍然是getContext().有没有办法解决?我不明白为什么((Activity)getContext()).finish(); 不工作

看一下-class文档Activity.

正如你所看到的那样Context是超类Activity- 意味着每一个Activity都是一个Context而不是每一个Context都是一个Activity.换句话说((Activity) getContext()).finish();可能会导致ClassCastException.

你可以做些什么来验证Context你得到的其实也是一个Activity像这样的检查:

if( getContext() instanceof Activity )
   Log.e( "TAG", "getContext() returns an Activity!" );
Run Code Online (Sandbox Code Playgroud)

在你打电话之前添加,finish()并检查LogCat是否同意它Activity.