首页 > 解决方案 > Android:应用程序被杀死时如何保持持久性?

问题描述

Android 应用指南建议使用与视图分离的模型来保持持久性,并解释说:

持久性是理想的,原因如下:

  • 如果 Android 操作系统破坏您的应用程序以释放资源,您的用户不会丢失数据。
  • 当网络连接不稳定或不可用时,您的应用程序将继续工作。

我想知道即使应用程序被杀死,应用程序如何不会丢失数据?

标签: androidandroid-architecture-componentsandroid-jetpack

解决方案


这是架构模式中遵循的实践之一。这意味着 View(Activity/Fragment) 的作用只是显示数据,它不应该直接对数据进行更改。这反过来帮助我们解决了许多与持久性相关的问题:为了对此进行更多解释,假设您正在创建一个类似 Instagram 的应用程序,该应用程序允许当前登录的用户关注/取消关注该用户。我们希望此按钮能够影响具有关注者数量的标签,并相应地更改按钮上的文本。让我们通过一个代码示例来理解。

代码:

public class UserProfileActivity extends AppCompatActivity {
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    isFollowing = webService.getIsFollowing();
    numberOfFollowers = webService.getNumberOfFollowers();
    toggleButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            toggleFollow();
        }
    });
}

private void toggleFollow() {
    if (isFollowing)
        unFollow();
    else
        follow();
}

private void unFollow() {
    isFollowing = false;
    numberOfFollowers -= 1;
    followersText.setText(numberOfFollowers + " Followers");
    setNotFollowingButton();
}

private void follow() {
    isFollowing = true;
    numberOfFollowers += 1;
    followersText.setText(numberOfFollowers + " Followers");
    setFollowingButton();
}

private void setFollowingButton() {
    toggleButton.setText("Following");
    toggleButton.setBackground(getLightGreenColor());
}

private void setNotFollowingButton() {
    toggleButton.setText("Follow");
    toggleButton.setBackground(getGreenColor());
}

}

除了脏代码之外,它还有重大缺陷

  1. 活动/片段等应用组件不是由我们管理,而是由 Android 操作系统管理。
  2. 它们的生命周期不在我们的控制之下,它们可以根据用户交互或内存不足等其他因素随时销毁
  3. 如果我们要在 UI 组件中创建和处理数据,那么一旦该组件被销毁,我们的所有数据都将被销毁。

在此示例中,每次用户旋转设备时,活动都会被销毁并重新创建,导致所有数据成员重置并再次执行网络调用,浪费用户带宽并迫使用户等待新的查询完全的。因此,最好避免 UI 中的数据处理部分

为了获得更多理解和清晰度,建议您观看 Lyla 的此视频。她用一个类似的例子很好地解释了。如果您需要更清晰的视频链接,请告诉我:DroidCon Architectural Components 另一个有用的链接:好文章为什么坚持 UI 不是一个好的选择


推荐阅读