[英]finish activity from custom view using context
这是我的代码:
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内存中的位图? 我有什么想法可以做到这一点?
如果在Activity
声明了makeDialog2()
尝试使用this
或YourActivityName.this
而不是getContext()
。 如果不是,那么尝试使用this
或YourActivityName.this
将Context
传递给方法作为参数,从中调用方法。
通过结束活动它会自动销毁变量吗?
完成Activity
应该销毁它和所有相关资源。 如果稍后启动Activity
的新实例,它将重新创建其所有资源。 除非你使用某种静态变量 - 只要你的应用程序运行,它们就会保持“活着”。
调用此方法的地方实际上是surfaceview,因此我给它的任何参数基本上仍然是getContext()。 有没有办法解决? 我不明白为什么((Activity)getContext())。finish(); 不工作
看一下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
。
我解决了 也许这是一个bug,但我必须先在getContext()函数之前调用类名。 也许它是对话函数的错误或我的代码结构中的错误。
ClassName.this.getContext()
我设法找到了解决此问题的方法,并避免了ClassCastException。
首先覆盖Activity中的getApplicationContext()方法,以便它返回当前实例
@Override
public Context getApplicationContext() { return this; }
此方法仍将返回具有Context引用类型的实例,但您现在可以在将其传递到自定义视图之前将其强制转换为YourActivity。
new CustomView((YourActivity) getApplicationContext());
另外,请确保在自定义视图中使用YourActivity
而不是Context
来引用它。
希望这篇文章可以帮助其他遇到此问题的人:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.