我正在开发一个android平板电脑应用程序,我需要实现屏幕方向(横向和纵向)。当屏幕方向改变碎片asyntactask再次重新启动时。 (有时应用程序崩溃)我需要停止重新启动asynctask并再次请求数据。想要将现有的json数据加载到新的屏幕上。 任何帮助欣赏。避免重新启动片段asynctask屏幕方向变化
接近:android:configChanges="keyboardHidden|orientation|screenSize"
不工作,因为即时通讯使用片段类。
我正在开发一个android平板电脑应用程序,我需要实现屏幕方向(横向和纵向)。当屏幕方向改变碎片asyntactask再次重新启动时。 (有时应用程序崩溃)我需要停止重新启动asynctask并再次请求数据。想要将现有的json数据加载到新的屏幕上。 任何帮助欣赏。避免重新启动片段asynctask屏幕方向变化
接近:android:configChanges="keyboardHidden|orientation|screenSize"
不工作,因为即时通讯使用片段类。
你可能会发现一些破解(包括静音配置更改或保留实例)以某种方式让它工作,但真的是AsyncTask
s are evil,你应该保持尽可能多的时间。
如果您当前的AsyncTask
的工作是在将网络中的某些数据显示在Fragment
之前,我建议您使用AsyncTaskLoader
。 javadoc中的例子应该给你一个关于如何实现它的好主意。
这将允许网络请求在旋转时继续前进,只有在准备好处理它时才通知UI(即LoaderManager.LoaderCallbacks
)(因此例如在旋转时不会),并且还会缓存结果是每次需要数据时都不会重新发出网络请求。
还有一堆第三方库试图解决这个非常普遍的问题,而且它也错综复杂,但如果我正确理解你的用例,它应该就是你所需要的。
不要忘记,无论您选择的解决方案,将必须考虑旋转(活动破坏/重新创建)发生之前,期间和数据的后负荷。
看来这种方法不太推荐。如果您在onCreate()
方法中初始化并执行AsyncTask
,我建议使用this方法。基本上,它包括在运行时配置更改中保存不需要重新启动的数据,以便在之后的onCreate()方法中处理它们,并确定要保留哪些信息与先前的风景保持一致,哪些信息应该重新启动。
只需使用setRetainInstance方法就可以轻松避免片段的“重新创建”。
公共无效setRetainInstance(布尔保留)
控制片段实例是否被保持跨越活动 重新创建(例如从配置改变)。这只能是 与不在后退堆栈中的碎片一起使用。如果设置,当活动被重建的片段 生命周期会略有不同:
• 的onDestroy()不会被调用(但onDetach()仍然是,因为 片段将被从其当前活动分开)。
• onCreate(Bundle)将不会被调用,因为片段不是被重新创建的 。
•onAttach(Activity)和onActivityCreated(Bundle)将继续调用 。
您可以在您使用此例如onCreateView方法,像这样:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
setRetainInstance(true);
// ... more of your code
}
虽然包含片段中的活动仍然重新创建,该片段实例将是相同,并将重新附加到新的活动中。
记住,即使setRetainInstance的onCreateView方法将总是被调用(定向变化),因为该片段需要根据新的空间/尺寸膨胀的观点,因此,如果您是从执行你的AsyncTask方法,您应该考虑将其移动到onCreate方法(该方法将只执行一次)以避免每次方向更改都“重新启动”。
希望它有帮助。
屏幕改变取向引起的onCreate()。 如果你想避免的AsyncTask重新把它放在的onResume或尽量避免的onCreate时改变方向。 –
或保存异步任务的状态,然后在重新启动时从您离开的位置继续工作 – Massimo