这是我的代码:
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内存中的位图?我有什么想法可以做到这一点吗?
答案 0 :(得分:9)
如果使用makeDialog2()
或Activity
而不是this
在YourActivityName.this
内宣布getContext()
。如果不是,请尝试使用Context
或this
从您调用方法的地方将YourActivityName.this
作为参数传递给方法。
通过结束活动,它会自动销毁变量吗?
完成Activity
应该销毁它和所有相关资源。如果稍后启动Activity
的新实例,它将重新创建其所有资源。除非你使用某种静态变量 - 它们将保持"活着"只要您的应用正在运行。
调用此方法的地方实际上是surfaceview,因此我给它的任何参数基本上仍然是getContext()。有没有办法解决?我不明白为什么((Activity)getContext())。finish();没有工作
查看documentation for the Activity
-class。
正如您所看到的,Context
是Activity
的超类 - 意味着每个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
来引用此内容。
希望这篇文章可以帮助其他遇到此问题的人:)