当前位置: 首页 > 知识库问答 >
问题:

在onRestoreInstanceState之后从片段执行操作

慕宏博
2023-03-14

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

该视图包含通过Internet获取的卡的列表。此视图用于多个地方。假设其中一个是我的碎片。

下面是我在Fragment中的操作:

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

为了论证起见,我想从视图本身保存视图的数据。因此碎片/活动或W/E使用它不需要知道它是如何在内部工作的。如果我在多个地方使用它,我就不需要重复存储\还原这个视图的代码。

好了,现在的问题是:

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

  1. SavedState:私有SavedState(中的包裹){
  2. SavedState:public void writeToParcel(Parcel out,int标志){
  3. CardHelper:public void init(Data Data){
  4. CardHelper:public void onRestoreInstanceState(可打包状态){

如您所见,OnRestoreInstanceState仅在OnActivityCreated之后执行。但我需要知道在此之前我是否应该在init方法中执行网络操作。因此,我希望首先执行onrestoreInstanceState,然后才执行init。但是碎片生命周期中没有方法可以在此之后完成。

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

共有1个答案

伯晨
2023-03-14

简单的修复方法应该是在CardHelper布局之后发布init()步骤,因此已经调用了OnRestoreInstanceState。为此,您只需在post(...)中执行init():

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

我还没测试过,我想它会有用的。

 类似资料:
  • 问题内容: 嗨,我用片段A,第二个片段用b。调用了b并使用了 方法,但是我第一次使用它是完美的,但是第二次使用它使应用程序崩溃,并且我的错误日志在以下:::我使用了Samsung平板电脑,但工作正常,但是Samsung core mobile崩溃了。 我的课程用于: 使用的第二个片段: 使用的第三个片段::: 问题答案: 这被称为 状态丢失 。您碰巧从AsyncTask提交FragmentTran

  • 问题内容: Android中的异步回调 试图在Android上以可靠的方式执行异步操作是不必要的麻烦,即AsyncTask确实在概念上存在缺陷吗?还是我只是缺少一些东西? 现在,一切都在引入片段之前。随着Fragments的引入,onRetainNonConfigurationInstance()已被弃用。因此,最新的Google宽容黑客手段是使用永久性的非UI片段,该片段会在配置发生变化(例如,

  • 问题内容: 我不确定这是怎么回事。基本上,我有一个ASyncTask类,它在后台照常进行操作。完成后我想做点事。现在,在您继续说“只使用onPostExecute()”之前,有一个陷阱。我需要运行的方法是在活动中,而不是在Task类中。 我看到的方式有两种选择。 A: 我希望我可以这样做,因为它是如此的简单,可以让我检查任务何时完成,而不必经常轮询活动和getStatus()。我不认为我会很幸运,

  • null java.lang.IllegalStateException:在onSaveInstanceState e/androidRuntime(9008):at android.support.v4.app.fragmentManagerImpl.checkStateLoss(fragmentManager.java:1354)e/androidRuntime(9008):at androi

  • 下面是我想在可能的情况下仅使用流式API复制的非流代码: 当然,对于流来说,简单的迭代很容易: 但我需要添加“before”和“after”行,前提是过滤后流不是空的。这可能在一个语句中实现,还是我需要收集? 这似乎不是一个更好的解决方案。。。