在onRestoreInstanceState之后执行片段中的操作

时间:2017-02-18 11:09:46

标签: android android-fragments android-savedstate

我有一个执行某些网络操作的自定义视图。从该操作结果中,视图构建UI。

该视图包含通过互联网提取的卡片列表。此视图用于多个位置。让我们说其中一个是我的片段。

以下是我在片段中所做的事情:

class MyFragment extends Fragment  {
    // same as findViewById
    @BindView(R.id.card_list) CardHelper cardHelper;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // init my element with some data before it initializes
        cardHelper.init(data);
    }
}

以下是我的自定义视图的显示方式:

public class CardHelper extends ListView { 

   // some info that is built from internet data
   private List<HashMap<String, String>> cardElements = new ArrayList<>();

    public void init(Data data) {
        // does async network and then build a view based on results
        // Network operations could depend on data param
    }
}

好的,现在当用户从我的应用程序切换到另一个应用程序时,我的Fragment可能会被销毁。我想保存我的自定义视图的状态。因此,我的观点不需要再次从互联网上获取信息。因此,我将CardHelper附加以下数据(基于this回答):

public class CardHelper extends ListView { 
   // some info that is built from internet data
   private List<HashMap<String, String>> cardElements = new ArrayList<>();

    public void init(Data data) {
        // does async network and then build a view based on results
    }

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.cardElements = this.cardElements;
        return ss;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if(state instanceof SavedState) {
            SavedState ss = (SavedState)state;
            super.onRestoreInstanceState(ss.getSuperState());
            this.cardElements = ss.cardElements;
        } else {
            super.onRestoreInstanceState(state);
        }
    }

    private static class SavedState extends BaseSavedState {
        private List<HashMap<String, String>> cardElements = new ArrayList<>();

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            this.cardElements = new ArrayList<>();
            in.readList(this.cardElements, null);
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeList(this.cardElements);
        }

        public static final Parcelable.Creator<SavedState> CREATOR =
                new Parcelable.Creator<SavedState>() {
                    public SavedState createFromParcel(Parcel in) {
                        return new SavedState(in);
                    }

                    public SavedState[] newArray(int size) {
                        return new SavedState[size];
                    }
                };
    }
}

为了论证,我想从这个视图本身保存视图的数据。因此片段/活动或w / e使用它不需要知道它内部的工作原理。如果我在多个地方使用它,我就不需要复制存储\恢复此视图的代码。

好的,现在问题

创建CardHelper时,我第一次执行init手动使用某些data初始化视图。当我的片段被破坏并且应用程序转到后台然后恢复时,方法将按以下优先级执行:

  1. SavedState:private SavedState(Parcel in){
  2. SavedState:public void writeToParcel(Parcel out,int flags){
  3. CardHelper:public void init(数据数据){
  4. CardHelper:public void onRestoreInstanceState(Parcelable state){
  5. 如您所见onRestoreInstanceState仅在onActivityCreated之后执行。但我需要知道在此之前我是否应该在init方法中执行网络操作。所以我希望onRestoreInstanceState先执行,然后才init执行。但是片段LifeCycle中没有方法可以在此之后完成。

    如何重新格式化我的代码,我可以在调用onRestoreInstanceState CardHelper后调用我的片段中的某些操作?还有一件事onRestoreInstanceState在创建CardHelper时第一次不会被调用。但是我也需要在这种情况下初始化我的CardHelper。

1 个答案:

答案 0 :(得分:1)

简单修复应该是在init()布局后发布cardHelper步骤,因此onRestoreInstanceState已被调用。为此,您只需在init()中执行post(...)

cardHelper.post(new Runnable() {
                   public void run() {
                       cardHelper.init();
                   }
               });

Haven没有对它进行测试,我认为它会起作用。