android - Android:应用程序被杀死时如何保持持久性?
问题描述
Android 应用指南建议使用与视图分离的模型来保持持久性,并解释说:
持久性是理想的,原因如下:
- 如果 Android 操作系统破坏您的应用程序以释放资源,您的用户不会丢失数据。
- 当网络连接不稳定或不可用时,您的应用程序将继续工作。
我想知道即使应用程序被杀死,应用程序如何不会丢失数据?
解决方案
这是架构模式中遵循的实践之一。这意味着 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());
}
}
除了脏代码之外,它还有重大缺陷
- 活动/片段等应用组件不是由我们管理,而是由 Android 操作系统管理。
- 它们的生命周期不在我们的控制之下,它们可以根据用户交互或内存不足等其他因素随时销毁
- 如果我们要在 UI 组件中创建和处理数据,那么一旦该组件被销毁,我们的所有数据都将被销毁。
在此示例中,每次用户旋转设备时,活动都会被销毁并重新创建,导致所有数据成员重置并再次执行网络调用,浪费用户带宽并迫使用户等待新的查询完全的。因此,最好避免 UI 中的数据处理部分
为了获得更多理解和清晰度,建议您观看 Lyla 的此视频。她用一个类似的例子很好地解释了。如果您需要更清晰的视频链接,请告诉我:DroidCon Architectural Components 另一个有用的链接:好文章为什么坚持 UI 不是一个好的选择
推荐阅读
- java - 在 JavaCC 中我的解析器中缺少什么文本?
- javascript - JavaScript:如何读取本地文件(特别是 json 文件)?
- r - 您如何使用 dplyr::pull 将分组的列转换为向量?
- php - 如何修复 wordpress 在在线网站上卷曲
- javascript - 如何将 selected:clear 过滤器放入作为 JSON 加载的画布中?
- r - 如何从R中的列中提取一个文本元素?
- python - extract_first 仅导致第一项仅 .extract() 不起作用
- javascript - 如何从数组中排除元素?
- c++ - QObjectPicker 未在 Qt3DWidget 中接收悬停的 QMouseEvent
- javascript - 检查数组中所有值是否除以 3