我有一个我想阻止旋转的活动,因为我正在启动AsyncTask,屏幕旋转使它重新启动.
有没有办法告诉这个活动"即使用户像疯了一样摇动他的手机也不要旋转屏幕"?
基本上我Handler在我的消息中Fragment收到一堆消息,这些消息可能导致对话框被解除或显示.
当应用程序进入后台时,我得到了一个,onPause但仍然可以像我们期望的那样得到我的消息.但是,因为我正在使用片段,所以我不能只关闭并显示对话框,因为这将导致一个IllegalStateException.
我不能只是解雇或取消允许国家损失.
鉴于我有一个Handler我想知道是否有一个推荐的方法,我应该如何在暂停状态下处理消息.
我正在考虑的一个可能的解决方案是记录暂停时播放的消息并将其播放回来onResume.这有点令人不满意,我认为框架中必须有一些东西可以更优雅地处理这个问题.
使用Android中的retain Fragments在配置更改期间保存AsyncTask时,我认为这是最好的方法,我脑海中出现了一些关于UI Thread的Message Queue调用顺序的疑问.
例如:想象一下这种情况:
onDetach()被称为doInBackground()方法完成onPostExecute()调用AsyncTaskonAttach()被称为UI线程消息队列也可以这样:
队列顶部 - > onDetach()| onPostExecute()| onAttach()
我知道它不能,调用onPostExecute()将等到配置更改完成,据我所知,但这是如何工作的?来自活动,碎片生命周期的调用是否连续执行?
在大多数情况下,处理案件时
AsyncTask)执行后台处理Activity或FragmentActivity或者Fragment在用户线程完成后台处理之前可能会重新创建到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段
我不时地听说事件总线库可以处理活动,片段和后台线程之间的关系.(请参阅https://github.com/greenrobot/EventBus.它表示在活动,片段和后台线程中表现良好)
我遇到了一些非常受欢迎的事件总线库
我想知道,当处理活动,碎片和后台线程之间的关系时,事件总线方法与保留碎片方法有何不同?
推荐哪种方式?
android event-bus android-asynctask otto greenrobot-eventbus
我已经为Android编程了一段时间,我仍在寻找保留数据而不是配置更改的解决方案.除了节约Parcelables到活动的Bundle在onSaveInstanceState文档使用暗示Fragment与setRetainInstance标志设置为true.
但我刚刚遇到一些onRetainCustomNonConfigurationInstance用于保存任意对象的代码(以一种奇特的方式,但基本上是没有引用的大对象Activity等).我从未见过这种方法,所以我有些疑惑:
onRetainNonConfigurationInstance(),也应该返回Object,实质上应该是同样的?作为奖励,我将不胜感激任何其他提示或解决方案,以节省状物体的状态AsyncTask,Observable,视图的主持人,并继续
android android-framework android-activity android-fragmentactivity
我被这一段时间所困扰了.当我单独Thread/ AsyncTask正在运行时,如何正确处理屏幕方向更改?目前,我有
android:configChanges="orientation|keyboard|keyboardHidden"
Run Code Online (Sandbox Code Playgroud)
在我的AndroidManifest.xml,但这并不是真的鼓励:
注意:应避免使用此属性,并仅将其用作最后的手段.有关如何通过配置更改正确处理重新启动的详细信息,请阅读处理运行时更改.
此外,在2.3仿真器中,它在切换到landscape,但切换回portrait失败时起作用.
现在,我使用的原因configChanges是因为当用户切换方向时,我可能AsyncTask正在运行,做一些网络流量,我不希望它停止.
有没有其他方法可以做到这一点,还是有办法修复2.3切换回肖像?
我知道onRetainNonConfigurationInstance,但我不确定"保存" AsyncTask实例是一个好主意,主要是因为扩展的类AsyncTask不是静态的(所以它与之相关Activity) - 它需要是,因为在onPostExecute()它从Activity实例中调用方法.
使用案例:
用户启动将加载验证码的应用程序.用户填写验证码并尝试下载一些信息.
问题:
如果用户在下载时旋转设备Activity则被销毁.在执行结束时,AsyncTask正在尝试更新被破坏的内容Activity,结果是"View not attached to window manager".
"错误的"解决方案:
我可以用a掩盖问题,android:configChanges="orientation|keyboardHidden|screenSize"但是这样布局不会更新为横向.
我在问什么:
是否可以更改方向并更改传递给上下文的"参考" AsyncTask?
这个答案建议检查对话框是否为空,但它不是我正在寻找的.
在这里,他建议使用WeakReference(这里有一个关于如何使用它的好片段),但我不明白它是否是我正在寻找的.
更明确一点,这就是我在onPostExecute中所做的:
@Override
protected void onPostExecute(Auto result) {
progress.dismiss();
new DownloaderCaptcha(context).execute("");
((EditText)context.findViewById(R.id.editTextCaptcha)).setText("");
context.findViewById(R.id.progrBar).setVisibility(View.VISIBLE);
context.findViewById(R.id.captcha).setVisibility(View.INVISIBLE);
if(result != null) {
Storage.storeHistory(context, result.getTarga().getValue());
Intent i = new Intent(context, MenuActivity.class);
i.putExtra("result", result);
context.startActivity(i);
} else {
ErrorDialog.show(context, error);
}
}
Run Code Online (Sandbox Code Playgroud) 自从2009 AsyncTask年在Cupcake(API 3,Android 1.5)中推出以来,它一直被Android团队一直推广为:
他们提供的代码示例强化了这种简单的信息,特别是对于那些不得不以更痛苦的方式使用线程的人.AsyncTask非常有吸引力.
然而,在此后的许多年里,崩溃,内存泄漏和其他问题困扰了大多数选择AsyncTask在其生产应用程序中使用的开发人员.这通常是由于Activity 破坏和娱乐上运行时配置的变化(特别是取向/旋转),而AsyncTask运行doInBackground(Params...); 当onPostExecute(Result)被调用时,Activity已经被破坏,使UI引用处于不可用状态(或甚至null).
Android团队在这个问题上缺乏明显,清晰,简洁的指导和代码样本只会让事情变得更糟,导致混乱以及各种变通方法和黑客攻击,有些体面,有些可怕:
显然,既然AsyncTask可以在很多情况下使用,那么就没有一种方法可以解决这个问题.然而,我的问题是关于选择.
什么是规范(由Android团队认可)最佳实践,使用简洁的代码示例,AsyncTask与Activity/ Fragmentlifecycle 集成并在运行时配置更改时自动重启?
android android-lifecycle android-configchanges android-asynctask android-memory
我需要在我的应用中多次调用同一线程。使用我的原始代码,第一次执行就可以了。但是第二次崩溃-然后我得知每个线程只能执行不超过一次。
我的原始代码:
View.OnClickListener myClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
mythread.start();
}
};
Thread mythread = new Thread(){
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Running...");
}
});
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
demoBt.setText("Finished...");
}
});
}
};
Run Code Online (Sandbox Code Playgroud)
因此,正如我所说,如果我尝试第二次运行它,它将崩溃。所以我试着像这样修改它:
View.OnClickListener myClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
test();
}
};
private void test(){
Thread mythread …Run Code Online (Sandbox Code Playgroud)