Android – 在渲染线程内结束活动

下午好。

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

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

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

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

这可能只是我愚蠢而没有看到这样做的简单方法,但有没有办法访问Activity并调用activity.finish(); 无需将参考文件一直传递下去?

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

您需要遵守线程安全规则,而不是直接从渲染线程调用activity.finish()。 处理此问题的最佳方法是将runnable发布回UI Thread的事件队列。 让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()可以在同一个类中,也可以在不同的类中。 这是你必须做出的选择。 最终这是一个你必须决定的架构问题。

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

为了解决我遇到的问题:

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

在这种情况下,只调用activity类中的onPause()方法。 即使应用程序以短暂延迟完成,也不会调用onStop()onDestroy()方法。

希望这有助于任何人面临同样的问题。

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