片段状态损失?

Eli*_*eth 7 android android-fragments

究竟什么是"国家损失"情况?你能展示一个完整的场景(包括一些代码)会导致它吗?我已经阅读了很多教程(官方和非官方),博客,有关该主题的stackoverflow问题/答案,但从来没有这样的例子会导致实际的状态损失以及状态丢失发生后的实际情况.

我不知道为了造成国家损失所做的全部步骤.我试图做的是:

  1. 具有包含框架布局的布局的Activity.
  2. 一个片段,在一些TextView中有一个带有'hello'文本的布局.
  3. Fragment与片段事务一起添加到上面的帧布局中.
  4. 用户按下主页按钮,然后发生使用commitAllowingStateLoss()方法提交的片段事务的方案.

然后我尝试进行配置更改,但一切都很好.然后我试图从后台恢复,但一切都很好.然后我试图一个片段添加到背堆栈并执行commitAllowingStateLoss(),然后将上述步骤,但配置改变发生时或当我从背景回来,然后我按下了哪个做删除事务的返回按钮意味着从后堆栈中移除片段,这意味着不会发生状态丢失.

那究竟是什么'国家损失'?它如何影响用户在屏幕上看到的内容.你能展示一个完整的州损失情景吗?

编辑:放一些测试代码:

活动代码:

package com.example.statelosstest;

import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
}

@Override
protected void onStop() {
    super.onStop();

    //Just for test
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            addDummyFragment();             
        }
    }, 5000);
}

/**
 * Invoke this method after onSaveInstanceState has been called,
 * for example after user press android home button.
 */
private void addDummyFragment(){
    DummyFragment frag = new DummyFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.add(R.id.fragment_frame, frag, frag.getClass().getName());

    // tried this also
    // transaction.addToBackStack(frag.getClass().getName());

    transaction.commitAllowingStateLoss();
}

}
Run Code Online (Sandbox Code Playgroud)

编辑:仍然没有答案 -
我试图模拟我认为会导致状态丢失的事情,我会在UI中看到状态丢失,但无法模拟或导致任何状态丢失情况.请有人可以显示状态丢失发生的情况,并且可以在UI中看到,这意味着状态丢失确实发生了真正发生的意外行为.

Hir*_*bar 6

一些状态损失的例子:

1.假设你有一个按钮和一个文本视图。在代码中,您定义了初始值为 0 的整数 i,通过单击按钮递增 1,其值显示在文本视图中。假设你按下按钮5次,那么textview将被设置为0。也就是说,Integer在屏幕变化时丢失了它的值

解决方案:重写onSaveInstanceState并放入整数值。然后在 onResume 或 onCreate 方法中保留该整数的值。

2.假设你有一个待办事项列表视图。用户动态添加到该列表视图中的 dos。假设用户添加了 3 个项目,然后在屏幕旋转时(或者如果应用程序重新启动),列表视图将变为空。

解决方案:再次在onSaveInstanceState中,放入ArrayList。(列表可以实现为“Serializabe”或“Parcelable”,并且可以作为一个整体存储。您不需要存储listview的每个项目)。然后在 onResume 或 onCreate 方法中,获取该列表视图。

3.当屏幕旋转时,屏幕中的所有编辑文本将变为空。

我对状态丢失的简单理解是,每当配置更改(屏幕旋转或应用程序重新启动)时,都会调用 Activity 的整个生命周期。所以,凡是没有得救的,都会丢失。

好吧,这让我想起任天堂的退出屏幕消息,“任何未保存的内容都将丢失”。