我正在开发一个Android平板电脑应用程序,我需要实现屏幕方向(横向和纵向)。当屏幕方向改变时,片段asyntactask再次重启。 (有时应用程序崩溃)我需要停止重新启动asynctask并再次请求数据。想要将现有的json数据加载到新屏幕中。 任何帮助欣赏。
approch:android:configChanges="keyboardHidden|orientation|screenSize"
因为使用片段类而无法正常工作。
答案 0 :(得分:1)
似乎这种方法不太受推荐。如果您在AsyncTask
方法中初始化并执行onCreate()
,我建议您使用this方法。基本上它包括保存您不需要在运行时配置更改时重新启动的数据,因此您可以在onCreate()方法之后处理它们,并决定要保留哪些信息以及之前的格局以及哪些信息应该重新启动。
答案 1 :(得分:1)
您可以轻松地避免片段的“重新创建”,只需在其上使用setRetainInstance方法。
public void setRetainInstance(boolean retain)
控制是否在Activity中保留片段实例 重新创建(例如从配置更改)。这只能是 与不在后栈中的片段一起使用。如果设置,则片段 重新创建活动时,生命周期会略有不同:
• 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
}
虽然包含片段的Activity仍在重新创建,但片段实例将是相同的,并将重新附加到新活动。
请记住即使使用setRetainInstance,也会始终调用onCreateView方法(在方向更改中),因为片段需要根据新的空间/维度对视图进行膨胀,因此如果您正在执行从该方法中你的asynctask,你应该考虑将它移动到onCreate方法(只执行一次),以避免每次方向更改的“重新启动”。
希望它有所帮助。
答案 2 :(得分:1)
你可能会发现一些黑客攻击(包括静默配置更改或保留实例)以某种方式让它工作,但实际上AsyncTask
s are evil并且你应该尽可能地保持它的大部分时间。
如果您当前AsyncTask
的工作是在从Fragment
中展示数据之前从网络加载某些数据,我建议您使用AsyncTaskLoader
。 javadoc中的示例应该让您了解如何实现它。
这将允许网络请求在您旋转时继续运行,以便仅在准备好处理结果时通知UI(即LoaderManager.LoaderCallbacks
)结果(例如,在旋转时不通知),以及还会缓存结果,以便每次需要数据时都不会重新发出网络请求。
有许多第三方库试图解决这个非常常见的问题,Loader
也有它们的错综复杂,但如果我理解你的用例正确,它应该就是你需要的。< / p>
不要忘记,无论您选择何种解决方案,都必须考虑在加载数据之前,期间和之后发生的轮换(活动销毁/重新创建)。