3

下午好。

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

我有一个带有 GLSurfaceView 的活动,可以在屏幕上绘制各种东西。在这个 GLSurfaceView 的渲染线程中,我执行所有渲染以及实际的更新逻辑(我最终将把它分开)。

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

通常我可以用 System.exit(0); 但是以这种方式结束活动似乎不会调用 OnStop(); OnDestroy(); 方法。

这可能只是我很傻,没有看到这样做的简单方法,但有没有办法访问 Activity 并调用 activity.finish(); 无需一直向下传递对它的引用?

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

4

3 回答 3

5

您确实需要遵守线程安全规则,而不是直接从渲染线程调用 activity.finish()。处理此问题的最佳方法是将可运行对象发布回 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();
      }
   } );
}

请注意用于回发到 UI 线程的处理程序。这样就可以安全地调用 activity.finish()。我在文档中找不到任何具体信息,说明从另一个线程调用 finish() 是安全的还是不安全的,所以为了安全起见,将其发回。

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

于 2010-11-29T15:22:55.363 回答
1

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

于 2010-11-29T15:18:34.380 回答
1

为了解决我遇到的问题:

如果您通过activity.finish()它完成您的活动(包括从另一个线程),那么渲染线程的onDraw()方法不会被阻塞(由于我实现双缓冲区渲染而发生在我身上)是很重要的。

在这种情况下,只有onPause()活动类中的方法被调用。即使应用程序以短暂的延迟完成,这些方法onStop()也没有被调用。onDestroy()

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

编辑:原因是,我在渲染线程被阻塞时activity.onPause()调用了我的方法。glSurfaceView.onPause()onDraw()

于 2013-12-16T05:12:04.500 回答