避免在屏幕方向更改时重新启动片段asynctask

时间:2014-01-29 09:25:44

标签: android android-fragments android-asynctask android-fragmentactivity android-orientation

我正在开发一个Android平板电脑应用程序,我需要实现屏幕方向(横向和纵向)。当屏幕方向改变时,片段asyntactask再次重启。 (有时应用程序崩溃)我需要停止重新启动asynctask并再次请求数据。想要将现有的json数据加载到新屏幕中。 任何帮助欣赏。

approch:android:configChanges="keyboardHidden|orientation|screenSize"因为使用片段类而无法正常工作。

3 个答案:

答案 0 :(得分:1)

似乎这种方法不太受推荐。如果您在AsyncTask方法中初始化并执行onCreate(),我建议您使用this方法。基本上它包括保存您不需要在运行时配置更改时重新启动的数据,因此您可以在onCreate()方法之后处理它们,并决定要保留哪些信息以及之前的格局以及哪些信息应该重新启动。

答案 1 :(得分:1)

您可以轻松地避免片段的“重新创建”,只需在其上使用setRetainInstance方法。

  

public void setRetainInstance(boolean retain)

     

控制是否在Activity中保留片段实例   重新创建(例如从配置更改)。这只能是   与不在后栈中的片段一起使用。如果设置,则片段   重新创建活动时,生命周期会略有不同:
  •   onDestroy()不会被调用(但onDetach()仍然会被调用,因为   片段正在脱离其当前的活动。)   •   因为片段不存在,所以不会调用onCreate(Bundle)   重新创建。
  •onAttach(Activity)和onActivityCreated(Bundle)将   仍被称为。

Reference link

您可以在onCreateView方法中使用它,例如:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    setRetainInstance(true);
    // ... more of your code
}

虽然包含片段的Activity仍在重新创建,但片段实例将是相同的,并将重新附加到新活动。

请记住即使使用setRetainInstance,也会始终调用onCreateView方法(在方向更改中),因为片段需要根据新的空间/维度对视图进行膨胀,因此如果您正在执行从该方法中你的asynctask,你应该考虑将它移动到onCreate方法(只执行一次),以避免每次方向更改的“重新启动”。

希望它有所帮助。

答案 2 :(得分:1)

你可能会发现一些黑客攻击(包括静默配置更改或保留实例)以某种方式让它工作,但实际上AsyncTasks are evil并且你应该尽可能地保持它的大部分时间。

如果您当前AsyncTask的工作是在从Fragment中展示数据之前从网络加载某些数据,我建议您使用AsyncTaskLoader。 javadoc中的示例应该让您了解如何实现它。

这将允许网络请求在您旋转时继续运行,以便仅在准备好处理结果时通知UI(即LoaderManager.LoaderCallbacks)结果(例如,在旋转时不通知),以及还会缓存结果,以便每次需要数据时都不会重新发出网络请求。

有许多第三方库试图解决这个非常常见的问题,Loader也有它们的错综复杂,但如果我理解你的用例正确,它应该就是你需要的。< / p>

不要忘记,无论您选择何种解决方案,都必须考虑在加载数据之前,期间和之后发生的轮换(活动销毁/重新创建)。