0

我主要Activity是在按下按钮时会启动其他名为 Getter 的类,并且该 Getter 类会创建 1-60 000 个线程(用于处理网络内容),因此它们都需要一些时间才能完成。我的问题是,当我在这些线程运行时旋转我的设备时,我的程序停止正常工作。在我的主要活动中,我有处理程序每​​ 2 秒从 Getter 类获取一个数组,然后将这些值放入本地数组列表中。

我试过这个解决方案:

后台任务、进度对话框、方向更改 - 是否有任何 100% 可行的解决方案?

但发现它非常复杂。所以现在我想知道是否有其他解决方案可以解决我的问题。例如,即使我的方向发生变化,我的线程是否可以继续在后台运行?如果这是不可能的,我可以以编程方式将方向锁定到按下按钮之前的方向,然后等到线程完成,然后再次使方向与传感器一起使用吗?

4

2 回答 2

0

我们处理这个问题的方法是从粘性启动异步任务,app.Service并允许异步任务与父服务通信,而父服务又与通过 BroadcastReceiver 框架收听它的广播事件的任何人通信。我已经以某种方式在这里描述了这种机制。

在方向更改时,您app.Activity将被销毁,但后台服务不会被销毁(它可以是onLowMemory&无数其他情况,但可能不会)。在重新创建活动时,您可以通过我在此处发布的解决方案检查您的服务是否仍在运行。根据该结果,您可以决定如何处理 UI,重新显示/重新添加进度对话框或其他任何内容,并重新注册您的接收器以侦听来自服务的事件。

这些层之间的职责是这样的;

  1. 异步任务
    • 做这项工作。
    • Intents通过触发事件 ( )报告它在做什么以及何时完成
    • 而已
  2. 服务
    • 为 AsyncTask 托管一个不知道方向的容器
    • 为 #onCreate 中的 AsyncTask 发出的事件注册侦听器
    • 在#onStartCommand 中执行 AsyncTask
    • stopSelf()当它从 AsyncTask 接收到“我已经完成”事件时停止自身(参见参考资料)
    • 向任何收听的人触发描述进度的事件
  3. 活动
    • 启动服务,该服务又启动 AsyncTask。
    • 为 #onCreate 中的服务发出的事件注册侦听器
    • 在 onCreate 期间检查服务是否已经在运行,以决定工作是否正在进行或需要开始。

3 个元素具有离散的、不混淆的角色。这就是我们喜欢的方式。这种方法的唯一细微差别是使用BroadcastReceivers. 如果您对这些感到满意,那么您就是黄金。

于 2012-08-15T20:50:41.313 回答
0

您可以锁定方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

参考https://stackoverflow.com/a/3611554/1008278

于 2012-08-15T19:34:15.220 回答