簡體   English   中英

從onRestoreInstanceState之后的片段執行操作

[英]Execute operation from fragment after onRestoreInstanceState

我有一個執行一些網絡操作的自定義視圖。 根據該操作結果,視圖將構建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
    }
}

好的,現在當用戶從我的應用程序切換到另一個應用程序時,我的片段可能會被破壞。 我想保存自定義視圖的狀態。 因此,我的觀點不需要再次從互聯網獲取信息。 因此,我在CardHelper后面附加了以下數據(基於答案):

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];
                    }
                };
    }
}

為了便於討論,我想從該視圖本身中保存該視圖的數據。 因此,片段/活動或使用它不需要知道它在內部如何工作。 而且,如果我在多個地方使用它,則無需重復存儲/恢復此視圖的代碼。

好的,現在解決這個問題

首次創建CardHelper時,我會執行init來使用一些data手動初始化視圖。 當我的片段被銷毀並且應用程序進入后台然后恢復時,將按以下優先級執行方法:

  1. SavedState:私人SavedState(打包){
  2. SavedState:public void writeToParcel(打包出來,為int標志){
  3. CardHelper:public void init(Data data){
  4. CardHelper:public void onRestoreInstanceState(Parcelable state){

如您所見, onRestoreInstanceState僅在onActivityCreated之后執行。 但是在此之前,我需要知道是否應該在init方法中執行網絡操作。 所以我想先執行onRestoreInstanceState ,然后再執行init 但是, LifeCycle片段中沒有方法可以在此之后完成。

onRestoreInstanceState上的CardHelper被調用之后,如何重新格式化可以在片段中調用某些操作的代碼? onRestoreInstanceState ,不會第一次調用CardHelper 但是在這種情況下,我也需要初始化CardHelper。

簡單的解決方法是在cardHelper之后發布init()步驟,因此已經調用了onRestoreInstanceState 為此,您只需要在post(...)執行init() post(...)

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

還沒有測試過,我想它會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM