Android - 从渲染线程中结束活动

时间:2010-11-29 15:00:09

标签: java android android-activity lifecycle renderer

下午好。

我不熟悉android中的活动生命周期,并且尽可能地阅读,但我无法想出如何以一种很好的方式解决以下问题。

我有一个带有GLSurfaceView的活动,可以在屏幕上绘制各种内容。在这个GLSurfaceView的渲染线程中,我执行所有渲染以及实际更新逻辑(我最终会将其分离出来)。

我遇到的麻烦来自渲染器中绘制的一个“屏幕”我希望结束Activity并让它调用各种生命周期方法。

通常我可以使用System.exit(0)执行此操作;但是以这种方式结束活动似乎并没有调用OnStop();的OnDestroy();方法

这可能只是我很愚蠢而没有看到这样做的简单方法,但有没有办法访问Activity并调用activity.finish();没有必要将引用一直传递给它?

这可能不是一个Android问题,更像是一般的java问题?对不起,我两个都有点生疏了。也许如果有人能够在他们的应用程序中大致解释他们如何处理这样的问题。

3 个答案:

答案 0 :(得分:5)

您需要遵守线程安全规则,而不是直接从渲染线程调用activity.finish()。处理此问题的最佳方法是将runnable发布回UI线程的事件队列。让Runnable调用activity.finish()。

您不必将活动传递到计划停止活动的区域。这就是我要做的。将活动传递给您在onCreate()中实例化的类。类似的东西:

public void onCreate( ... ) {
   MyRenderer renderer = new MyRenderer( glSurface, this );
}

然后在MyRenderer中我会做类似的事情:

public void someMethodInRenderer() {
   if( stop ) {
      stop();
   }
}

public void stop() {
   Handler handler = new Handler();
   handler.post( new Runnable() {
      public void run() {
         activity.finish();
      }
   } );
}

请注意Handler用于回发到UI线程。这样可以安全地调用activity.finish()。我在文档中找不到任何具体信息,说明从另一个线程调用finish()是安全的或不安全的,以便安全地将其发回。

要记住的事情。如果someMethodInRenderer()深入程序的内部,那么您不必直接访问活动实例。你只需要一个引用,最终调用活动来完成。所以可能有一个对系统的另一部分的引用,你传递给那个你可以添加stop()的方法。所以stop()和someMethodInRenderer()可以在同一个类中,也可以在不同的类中。这是你必须做出的选择。最终这是一个你必须决定的架构问题。

答案 1 :(得分:1)

如果渲染器线程在Activity内部,则可以使用ActivityClassName.this.finish();

答案 2 :(得分:1)

为了解决我遇到的问题:

如果您通过activity.finish()完成了您的活动(包括来自其他主题),那么渲染线程的onDraw()方法不会被阻止很重要(因为我双缓冲区渲染的实现)。

在这种情况下,只调用了活动类中的onPause()方法。即使应用程序以短暂延迟结束,也未调用方法onStop()onDestroy()

希望这可以帮助任何面临同样问题的人。

修改:原因是,我在activity.onPause()方法中调用了glSurfaceView.onPause(),而渲染线程的onDraw()被阻止了。