【问题标题】:finish activity from custom view using context使用上下文从自定义视图完成活动
【发布时间】:2011-12-21 08:22:02
【问题描述】:

这是我的代码:

    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 中进行一些测试后,我设法发现该活动在重试后仍在运行。

我的计划是通过两件事来解决这个问题。回收我的可绘制对象并作为一个整体结束第一个活动。但是,即使在我调用完成后,第一个活动也没有结束。有什么帮助吗? (到目前为止,在我的代码的其他部分使用 getContext() 已经奏效了)。

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

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:

    如果makeDialog2()Activity 中声明,请尝试使用thisYourActivityName.this 而不是getContext()。如果不是,请尝试将 Context 作为参数传递给方法,使用调用方法的位置使用 thisYourActivityName.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

    【讨论】:

    • 谢谢,你不仅帮了我,还解释了一个问题:)
    • 其实很抱歉,但有一个问题。调用这个方法的地方实际上是表面视图,因此我给它的任何参数基本上仍然是 getContext()。有没有办法解决?我不明白为什么 ((Activity) getContext()).finish();不工作
    • 我在回答中添加了更多内容。
    【解决方案2】:

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

    ClassName.this.getContext()
    

    【讨论】:

      【解决方案3】:

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

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

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

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

       new CustomView((YourActivity) getApplicationContext());
      

      另外,请确保在您的自定义视图中使用 YourActivity 而不是 Context 来引用它。

      希望这篇文章对遇到此问题的其他人有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2013-08-15
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        相关资源
        最近更新 更多