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

时间:2011-12-21 08:22:03

标签: java android eclipse

这是我的代码:

    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();
}

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

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

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

3 个答案:

答案 0 :(得分:9)

如果使用makeDialog2()Activity而不是thisYourActivityName.this内宣布getContext()。如果不是,请尝试使用Contextthis从您调用方法的地方将YourActivityName.this作为参数传递给方法。

  

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

完成Activity应该销毁它和所有相关资源。如果稍后启动Activity的新实例,它将重新创建其所有资源。除非你使用某种静态变量 - 它们将保持"活着"只要您的应用正在运行。


  

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

查看documentation for the Activity-class

正如您所看到的,ContextActivity的超类 - 意味着每个Activity都是Context,但不是每个Context都是Activity }}。换句话说,((Activity) getContext()).finish();可能会导致ClassCastException

您可以采取哪些措施来验证您获得的Context实际上也是Activity,请执行以下检查:

if( getContext() instanceof Activity )
   Log.e( "TAG", "getContext() returns an Activity!" );

在您致电finish()之前添加,并检查LogCat是否同意Activity

答案 1 :(得分:1)

我解决了。也许这是一个bug,但我必须先在getContext()函数之前调用类名。也许它是对话框函数的错误或我的代码结构中的错误。

ClassName.this.getContext()

答案 2 :(得分:0)

我设法找到解决此问题的方法,并避免使用ClassCastException。

首先覆盖Activity中的getApplicationContext()方法,使其返回当前实例

@Override
public Context getApplicationContext() { return this; }

此方法仍将返回具有Context引用类型的实例,但您现在可以在将其传递到自定义视图之前将其强制转换为YourActivity。

 new CustomView((YourActivity) getApplicationContext());

此外,请确保在自定义视图中使用YourActivity而不是Context来引用此内容。

希望这篇文章可以帮助其他遇到此问题的人:)