Android 线程和设备定向

Android 线程和设备定向,android,multithreading,orientation,Android,Multithreading,Orientation,我得到了mainActivity,按下按钮会启动另一个名为Getter的类,Getter类会创建1-60000个线程(用于处理网络事务),所以需要一些时间才能全部完成。我的问题是,当我在这些线程运行时旋转设备时,我的程序会停止正常工作。在我的主要活动中,我有一个处理程序,它每2秒从Getter类获取一个数组,然后将这些值放入本地数组列表中 我尝试了这个解决方案: 但是我觉得很复杂。所以现在我想知道是否有任何其他解决我的问题的办法。例如,即使我的方向改变,我的线程是否可以继续在后台运行?如果不可

我得到了main
Activity
,按下按钮会启动另一个名为Getter的类,Getter类会创建1-60000个线程(用于处理网络事务),所以需要一些时间才能全部完成。我的问题是,当我在这些线程运行时旋转设备时,我的程序会停止正常工作。在我的主要活动中,我有一个处理程序,它每2秒从Getter类获取一个数组,然后将这些值放入本地数组列表中

我尝试了这个解决方案:


但是我觉得很复杂。所以现在我想知道是否有任何其他解决我的问题的办法。例如,即使我的方向改变,我的线程是否可以继续在后台运行?如果不可能,我是否可以通过编程将方向锁定到按钮按下前的方向,然后等待线程完成,然后再次使方向与传感器匹配?

您可以锁定方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

请参阅

我们处理此问题的方法是从粘性
应用程序服务启动异步任务
,并允许异步任务与父服务通信,父服务通过BroadcastReceiver框架与收听其广播事件的任何人通信。我已经用某种方式描述了这种机制

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

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

  • 异步任务
    • 他做这项工作
    • 通过触发事件(
      意图
      )来报告它在做什么以及何时完成
    • 就这样
  • 服务
    • 为异步任务承载一个不知道方向的容器
    • 在#onCreate中为异步任务发出的事件注册侦听器
    • 在#onstart命令中执行异步任务
    • 当它从异步任务接收到“I have finished”事件时,停止自身(请参见
      stopSelf()
    • 向任何正在侦听的人激发描述进度的事件
  • 活动
    • 启动服务,然后启动异步任务
    • 在#onCreate中为服务发出的事件注册侦听器
    • 检查onCreate期间服务是否已在运行,以决定工作是否正在进行或需要启动

  • 3个元素具有离散的未使用角色。这就是我们喜欢的方式。这种方法唯一的细微差别是使用了
    广播接收器
    。如果你对这些都很满意,那么你就是黄金。

    现在,当你说“我尝试过这个解决方案”,然后说“但我发现它非常复杂”,这是否意味着你真的尝试过它?或者你开始和停止是因为它看起来像是过度杀戮?从这些步骤的声音来看,为什么它应该工作以及为什么您应该用这两种方法之一来实现它是有道理的。(aka:将任务与活动分离)我的意思是,这些步骤对我来说不够清晰,因此在互联网上对每一步都进行了大量搜索,直到我意识到这样做行不通。我需要一个对初学者更友好的教程。我也尝试过这个解决方案。这有一个问题。从纵向到横向,它都能完美地工作,但反过来,它根本不起作用。在横向调用NOSENSOR时,它会立即转到纵向。我可以使用AsyncTask处理线程正在处理的所有内容吗?我可以用AsyncTask替换我的thread类吗?我必须参考JavaDoc来回答这个问题,因此,请阅读这里的第2段,而不是中文的耳语-因此,听起来你仍然需要保留生成线程的实现(你的任务听起来好像需要一段时间,因此Android的AsyncTask实现可能不适合)但您仍然可以重复使用上述模式。我认为Android的这一领域必然是复杂的,因为你必须思考和计划你想要做什么,以避免破坏用户体验和/或用过度热心的资源密集型线程破坏其他活动。如果您需要更多的帮助/改进,请告知我,您可能已经想到了我概述的方法