线程和设备方向

时间:2012-08-15 19:21:08

标签: android multithreading orientation

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

我尝试了这个解决方案:

Background task, progress dialog, orientation change - is there any 100% working solution?

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

2 个答案:

答案 0 :(得分:0)

你可以锁定方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

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

答案 1 :(得分:0)

我们处理此问题的方法是从粘性app.Service启动异步任务,并允许异步任务与父服务进行通信,而父服务又通过BroadcastReceiver框架与任何收听它的广播事件的人进行通信。我已经走了一段时间来描述这种机制here

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

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

  1. 的AsyncTask
    • 是否有效。
    • 通过触发事件(Intents)报告它是什么以及何时完成
    • 就是这样
  2. 服务
    • 托管AsyncTask
    • 的方向无意识容器
    • 为#onCreate
    • 中的AsyncTask发出的事件注册侦听器
    • 在#onStartCommand
    • 中执行AsyncTask
    • 从AsyncTask收到“我已完成”事件时停止自身(请参阅stopSelf()
    • 触发描述任何人的进度的事件
  3. 活动
    • 启动服务,然后启动AsyncTask。
    • 为#onCreate
    • 中的服务发出的事件注册听众
    • 检查onCreate期间服务是否已经运行,以决定是否正在进行工作或需要开始工作。
  4. 具有离散非融合角色的3个元素。这就是我们喜欢它的方式。这种方法的唯一细微差别是使用BroadcastReceivers。如果你对这些感到满意,那么你就是金色的。