【发布时间】:2014-11-06 18:38:07
【问题描述】:
究竟什么是“状态损失”情况?你能演示一个完整的场景(包括一些代码)会导致它吗? 我已经阅读了许多关于该主题的教程(官方和非官方)、博客、stackoverflow 问题/答案,但从来没有一个会导致实际状态丢失以及状态丢失发生后实际发生的示例。
我不知道要执行哪些完整步骤才能导致状态丢失。 我试图做的是:
- 具有包含框架布局的布局的 Activity。
- 在一些 TextView 中具有带有“hello”文本的布局的 Fragment。
- 片段通过片段事务添加到上述框架布局。
- 用户按下主页按钮,然后使用 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();
}
}
编辑:仍然没有答案 -
我试图模拟我认为会导致状态丢失并且我会在 UI 中看到状态丢失但无法模拟或导致任何状态丢失情况的事物。请有人展示一个发生状态丢失并且可以在 UI 中看到的场景,这意味着状态丢失确实发生了意外行为。
【问题讨论】:
-
很棒的文章,但我之前已经读过(不止一次)。没有真实状态丢失的示例以及发生状态丢失时实际发生的情况。我只是无法想象为什么使用 commitAllowingStateLoss() 很危险?我无法想象它会真正影响我的代码的情况。你能展示一个代码和一个场景,因为 commitAllowingStateLoss() 会导致 UI 奇怪的行为,当然会在调用 onSaveInstanceState() 之后使用
-
@Alex Lockwood 你是我最后的希望 ;) 解决这个问题。
-
是什么让这不是状态丢失的情况?当您期望提交时(在现实世界中),提交将被丢弃。提交 UI 片段时的预期行为是什么?
-
我不懂你。当我使用 commitAllowingStateLoss 提交它时,例如我正在更改配置,然后提交就在那里,这意味着我添加的片段在那里,这意味着实际上没有发生状态丢失。