首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果状态是由我的类组成的,如何在Android中保存方向更改期间的状态?

如果状态是由我的类组成的,如何在Android中保存方向更改期间的状态?
EN

Stack Overflow用户
提问于 2010-10-12 22:55:51
回答 3查看 92.2K关注 0票数 56

我正在研究Android如何处理我的应用程序的方向改变(我发现它在方向改变时重新启动了主活动。我已经看到,您可以重写该方法

代码语言:javascript
运行
复制
protected void onSaveInstanceState(Bundle outState)

要保存内容,请使用in onStart。问题是我有一个带有自定义对象的视图和一个使用自定义适配器的列表视图。所有的东西都在这些对象的ArrayList中,但是我注意到你不能把任意的对象放在这个包中!那么我如何保存状态呢?

EN

回答 3

Stack Overflow用户

发布于 2010-10-13 01:05:22

首先,你需要确定应用程序中的“状态”到底是什么。您还没有说明您实际在做什么,但让我假设对象的ArrayList是用户正在处理的状态。

其次,确定此状态的生命周期实际上是什么。它真的与那个活动相关吗?或者,如果用户的电池电量不足,设备关闭,然后返回到您的应用程序,用户是否应该不会丢失它?如果是前者,则onSaveInstanceState()是正确的;如果是后者,则需要保存到onPause()中的持久存储中。

对于具有自定义对象的onSaveInstanceState(),关键是实现Parcelable接口。这包括在Parcelable上实现方法,以及在类中创建一个静态创建器对象。下面是一个典型的简单Parcelable类的代码:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java

关键功能是Parcelable实现:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java#317

和创建者静态类:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java#355

(静态writeToParcel()readFromParcel()只是为该类提供的便利,并不是必需的。)

现在,您可以使用Bundle.putParcelableArrayList将对象的整个ArrayList放入已保存状态包中

http://developer.android.com/reference/android/os/Bundle.html#putParcelableArrayList(java.lang.String, java.util.ArrayList)

Activity.onCreate()中,检查您是否有savedState Bundle,如果有,请尝试从中检索ArrayList并在找到时使用它,为用于显示它的新活动创建一个新的适配器和列表视图。

票数 17
EN

Stack Overflow用户

发布于 2015-05-02 16:17:05

使用Google的Gson将对象编写为JSON字符串,然后将它们保存为字符串。然后,在重新构建活动/片段时,从保存的JSON字符串重新构建它们

代码语言:javascript
运行
复制
import com.google.gson.Gson;

public class MyClass {
    private int a;
    private String s;
    private OtherSerializableClass other;
    private List<String> list;

    public String toJson() {
        return new Gson().toJson(this);
    }

    public static ChatAPI_MessagesArray fromJson(String json){
       return new Gson().fromJson(json, YourClass.class);
    }

    // Getters
    ...

    // Setters
    ...
}
票数 3
EN

Stack Overflow用户

发布于 2019-06-26 15:41:12

对于简单的数据,该活动可以使用onSaveInstanceState()方法并从onCreate()中的包中恢复其数据,但这种方法只适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,如用户列表或位图。

代码语言:javascript
运行
复制
The ViewModel class allows data to survive configuration changes such as screen rotations.
Architecture Components provides ViewModel helper class for the UI controller that is responsible for preparing data for the UI.

**Example**:

如果您需要在应用程序中显示用户列表,请确保分配职责以获取用户列表并将其保存到ViewModel,而不是activity或片段,如以下示例代码所示。

代码语言:javascript
运行
复制
public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<User>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.

        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3915952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档