1

如果用户在 REST(或任何其他长时间运行的异步操作)期间更改设备的方向,则片段将从活动中分离。

因此,如果此片段getActivity()在处理 REST 响应的代码中的任何位置使用,它将引发空指针。

我可以使用空检查来保护所有的调用getActivity()——但仍然有可能活动在检查行和使用行之间变为空。而且还有很多地方是这样做的,所以代码会变得一团糟。

如果我想在方向更改时更改布局,则 setRetainInstance(true) 不可用。+ 还有一些奇怪的效果,例如:多个片段、setRetainInstance(true) 和屏幕旋转

所以这让我想到,在片段中处理休息调用可能是一种不好的做法?

我见过一些实践,其中活动包含一个非可视片段来处理响应。但我想我不能把它放在碎片中。所以我必须使用活动作为中介并将结果到达当前片段?

我只是想,将所有内容都放在片段中更清洁。因为我不需要在其他地方修改代码。然后它是一个独立的实体,我可以毫无问题地将它放在其他地方。但是我该如何处理这些对上下文的不可靠引用呢?我的意思是如果片段被重新创建,我真的不关心分离的片段 - 它只需要默默地完成它正在做的任何事情,并且不要干扰我的新工作流程有异常。当然,我不想将所有内容都包含在内,try catch(Exception)因为我关心在其他情况下引发的异常。

4

3 回答 3

0

我通常将片段用作显示方面,将活动用作逻辑方面。就像 MVC - 片段是视图,活动是控制器。

所以我所有的片段都有这个代码:

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            listener = (FragmentListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement FragmentListener");
        }
    }

并且每个使用这个片段的活动都实现了 FragmentListener 接口。

一旦我得到来自服务器的响应,我只是填充(或只是调用正确的方法)片段,你可以在这里做一些空值检查,但这很少见......

于 2013-08-04T13:40:41.043 回答
0

你当然可以这样做。您可能想查看 AsyncTaskLoader 和 LoaderManager (它们专门处理您正在谈论的生命周期问题)。另请注意,任务加载器 ID 对于活动必须是唯一的,因此如果您有多个片段运行托管在同一活动中的加载器,则加载器 ID 不能全部相同 ;-)

于 2013-08-04T13:40:43.130 回答
0

在方向更改时,将重新创建活动。为了保护这一点,请使用以下代码

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" in manifest file ( i.e in activity tag )

并覆盖 MainActivity 中的方法

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
}
于 2013-08-05T05:07:50.603 回答