繁体   English   中英

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

[英]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()尝试使用thisYourActivityName.this而不是getContext() 如果不是,那么尝试使用thisYourActivityName.thisContext传递给方法作为参数,从中调用方法。

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

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


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

看一下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

我解决了 也许这是一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM