|
501
|
| Heikki Toivonen · 技术社区 · 17 年前 |
|
|
1
263
编辑: hackbod )在这个 StackOverflow post this blog post 了解更多信息。 您必须将其添加到清单中的活动声明中:
看来
问题是,当配置发生更改时,系统会销毁活动。看见 ConfigurationChanges
因此,将其放在配置文件中可以避免系统破坏您的活动。相反,它调用
|
|
|
2
156
当您切换方向时,Android将创建一个新视图。您可能会崩溃,因为您的后台线程正试图更改旧线程的状态。(它也可能有问题,因为您的后台线程不在UI线程上) 我建议让mHandler不稳定,并在方向改变时更新它。 |
|
|
3
69
我为这些问题提出了一个坚如磐石的解决方案,它符合“安卓方式”。我所有的长期运行操作都使用IntentService模式。
也就是说,我的活动广播意图,意图服务完成工作,将数据保存在数据库中,然后广播
意图。粘性部分很重要,因此即使活动在用户启动工作后暂停,并且错过了来自IntentService的实时广播,我们仍然可以响应并从调用活动中拾取数据。
基本上,您需要保存一个标志,表明您在保存的实例包中运行了一个进度对话框。 保存进度对话框对象,因为这将泄漏整个活动。为了获得进度对话框的持久句柄,我将其作为弱引用存储在应用程序对象中。在方向改变或其他任何导致活动暂停(电话、用户点击主页等)然后继续的情况下,我会关闭旧对话框,并在新创建的活动中重新创建一个新对话框。 对于不确定进度对话框,这很容易。对于进度条样式,您必须将最后一次已知的进度放在bundle中,以及您在活动中本地使用的任何信息,以跟踪进度。在恢复进度时,您将使用此信息在与以前相同的状态下重新生成进度条,然后根据当前状态进行更新。
总之,将长时间运行的任务放入IntentService,并明智地使用
|
|
|
4
28
经过反复试验,我似乎找到了解决办法。至少现在我可以在线程完成之前或之后随时旋转屏幕。在所有测试中,对话框正确关闭,所有行为都符合预期。
我所做的如下所示。目标是填充我的数据模型(
这对我来说很有用。我不知道这是否是Android设计的“正确”方法——他们声称这种“在屏幕旋转期间销毁/重新创建活动”实际上让事情变得更容易,所以我想这应该不会太棘手。 如果您看到我的代码中有问题,请告诉我。如上所述,我真的不知道是否有任何副作用。 |
|
|
5
15
最初的问题是,代码在屏幕方向改变后无法生存。显然,这是通过让程序自己处理屏幕方向的变化而不是让UI框架(通过调用onDestroy)来“解决”的。 我认为,如果潜在的问题是程序无法在onDestroy()中生存,那么公认的解决方案只是一种变通方法,它会使程序存在严重的其他问题和漏洞。请记住,Android框架明确指出,由于您无法控制的情况,您的活动几乎随时都有被破坏的风险。因此,无论出于何种原因,您的活动必须能够在onDestroy()和随后的onCreate()中生存,而不仅仅是屏幕方向的更改。 如果要自己处理屏幕方向更改以解决OP的问题,则需要验证onDestroy()的其他原因是否不会导致相同的错误。你能做到这一点吗?如果不是,我会质疑“被接受”的答案是否真的很好。 |
|
|
6
14
我的解决办法是延长期限
我重新定义了
这是我的密码:
|
|
|
7
8
我也遇到了同样的问题,我想出了一个解决方案,这个解决方案不涉及使用ProgressDialog,我得到了更快的结果。 我所做的是创建一个包含进度条的布局。
然后在onCreate方法中执行以下操作
这就是我所做的,我发现它比显示ProgressDialog运行得更快,侵入性更小,在我看来,它的外观更好。
|
|
|
8
7
我发现了一个在其他地方还没有看到的解决方案。您可以使用一个自定义应用程序对象,该对象知道您是否正在执行后台任务,而不是尝试在方向更改时被销毁和重新创建的活动中执行此操作。我在博客上写了这件事 here . |
|
|
9
7
我将贡献我的方法来处理这个轮换问题。这可能与OP无关,因为他没有使用
我有一个带有嵌套
在我的
其次,在我的父母身上
这有两个目的:第一,它允许我的
以下是整个课程:
我绝不是一个经验丰富的Android开发者,所以请随意评论。 |
|
|
10
4
将长任务移动到单独的类中。将其实现为主题观察者模式。每当创建活动时,注册并在关闭时注销任务类。任务类可以使用AsyncTask。 |
|
|
11
4
|
|
|
12
4
你也可以试着让我知道它是否适合你 |
|
|
13
3
|
|
|
14
2
它有点复杂,但它是调用服务器请求、数据预/后处理等的最佳方式。
|
|
|
15
2
我有一个实现,它允许在屏幕方向更改时销毁活动,但仍然成功地销毁重新创建的活动中的对话框。
我将AsyncTask子类化,为“拥有”活动添加了一个字段,以及一个更新此所有者的方法。
在我的活动课上,我添加了一个字段
进一步改进的建议:
|
|
|
16
2
如果您维护两个布局,所有UI线程都应该终止。
here . 更新: |
|
17
2
试图实施 jfelectron 这些问题的坚如磐石的解决方案符合“安卓方式” “但是我花了一些时间来查找和整理所有提到的元素。最终得到的结果略有不同,我认为更优雅的解决方案在这里全部发布。 使用从活动激发的IntentService在单独的线程上执行长时间运行的任务。该服务向更新对话框的活动发回粘性广播意图。该活动使用showDialog()、onCreateDialog()和onPrepareDialog()来消除在应用程序对象或savedInstanceState捆绑包中传递持久数据的需要。无论应用程序如何中断,这都应该有效。 活动类别:
IntentService类别:
清单文件条目:
内部应用程序部分
|
|
|
18
2
我也面临同样的情况。我所做的是在整个应用程序中只为我的进度对话框获取一个实例。 首先,我创建了一个DialogSingleton类,只获取一个实例(Singleton模式)
正如我在这个类中所展示的,我将进度对话框作为属性。每次需要显示进度对话框时,我都会获得唯一的实例并创建一个新的ProgressDialog。
当我完成后台任务时,我再次调用unique实例并关闭其对话框。
我将后台任务状态保存在共享首选项中。当我旋转屏幕时,我会询问是否有此活动的任务正在运行:(onCreate)
当我开始运行后台任务时:
当我完成后台任务时:
我希望有帮助。 |
|
|
19
2
如果后台任务只需要在活动处于前台时生存,那么“新”解决方案是托管后台线程(或者,最好是,
如果活动因配置更改而被销毁,则保留的片段仍然存在,但是
不
当活动在后台或后台堆栈中被销毁时。因此,如果出现以下情况,后台任务仍应中断:
|
|
|
20
2
我是安卓系统的新手,我试过这个,效果不错。
|
|
|
21
1
问题是,当旋转屏幕时,书上的每个解决方案都失败了。即使使用AsyncTask类,这也是Android处理这种情况的正确方法。旋转屏幕时,开始线程正在使用的当前上下文将消失,这会使显示的对话框混乱。问题总是对话框,不管我在代码中添加了多少技巧(将新上下文传递给正在运行的线程,通过旋转保持线程状态等等)。最后的代码复杂度总是很高,而且总有可能出错。 唯一对我有效的解决方案是活动/对话技巧。它很简单,很有天赋,而且都是防旋转的:
这是快速和工作良好。对于其他任务,我仍然使用对话框,而对于不需要在屏幕上显示恒定对话框的任务,我仍然使用AsyncTask。但在这种情况下,我总是选择活动/对话模式。 而且,我没有尝试过,但它甚至可以阻止活动/对话框在线程运行时旋转,从而加快速度,同时允许调用活动旋转。 |
|
|
22
1
现在有一种更独特的方式来处理这些类型的问题。典型的方法是: 1.确保您的数据与UI正确分离:
任何属于后台进程的内容都应该保存在一个
2.确保后台进程和UI之间的接口正确且安全:
你必须
颠倒
这 answer
现在,您必须担心后台任务与当前任务的接口
Fragment lifecycle 用于确定侦听器的设置最适合您的个人实现。
|
|
23
1
我找到了一个更简单的解决方案来处理方向改变时的线程。您可以只保留对活动/片段的静态引用,并在对ui执行操作之前验证其是否为null。我建议也使用try catch:
|
|
|
24
1
如果您正在努力检测对话框的方向更改事件 独立于活动引用 安装程序
实现1-对话框
实施3-ProgressDialog/AlertDialog
|
|
25
1
这是我面对它时的解决方案:
有两种方法可以解决此问题: 使在清单文件中的配置更改期间利用对话框保留状态的活动:
第二种方法:
|
|
|
26
0
看起来太“快速和肮脏”了,所以请指出缺陷,但我发现有效的是。。。 在AsyncTask的onPostExecute方法中,我只是将进程对话框的“.discouse”包装在一个try/catch块中(带有一个空的catch),然后简单地忽略引发的异常。这样做似乎是错误的,但似乎没有不良影响(至少对于我随后正在做的事情,即启动另一个活动,将我长期运行的查询结果作为额外结果传入) |
|
|
27
0
最简单、最灵活的解决方案是使用 AsyncTask 静态引用 ProgressBar . 这为方向更改问题提供了一个封装的、因而可重用的解决方案。这个解决方案很好地解决了各种异步任务,包括internet下载、与服务器通信 Services ,以及文件系统扫描。该解决方案已经在多个android版本和手机型号上进行了良好测试。可以找到完整的演示 here 对……特别感兴趣 DownloadFile.java
Android活动中的用法很简单
|
|
|
28
0
当你改变方向时,Android会终止该活动并创建新的活动。 我建议使用Rx java进行改装。它会自动崩溃。 改型调用时使用这些方法。
|
|
|
KolaYAndr · 活动RESULT_OK似乎从未发生过 1 年前 |
|
|
Taskeen Zahra · 从片段导航回来 2 年前 |
|
|
Igal · 如何将列表从一个活动传递到另一个活动? 3 年前 |
|
Shadow · 如何刷新碎片数据时,从以前的屏幕android? 3 年前 |
|
|
Tara · 如何从活动的片段中访问RecyclerView中的项目 8 年前 |