我是Android开发的初学者,我正在尝试用MVC模式编写代码,但是我无法理解模型的工作原理。据我所知,每次你开始一个有意图的新活动时,你都无法传递模型。据我所知,每次开始新活动时都必须重新初始化它。我错过了什么吗?我查看了Parcelable,但是如果你让你的模型Parcelable你似乎放松了你的方法。现在我正在构建一个登录系统,如果用户已经登录,它将在启动时检查我的本地sqllite数据库,如果是,则传递给另一个活动,否则它将传递给登录活动,但我想通过所有活动使该用户模型保持活跃状态。你是这样做的吗?
答案 0 :(得分:2)
您可能还需要考虑在要跨活动共享的模型数据周围保留静态引用,以便在切换活动时不必继续序列化/反序列化模型。如果您的模型很小,您可以使用Parcelable,但在某些时候,性能可能会成为一个问题。
我正在开发一个项目,我们将模型保存在我们可以在整个应用程序中访问的Singleton中,虽然我一般讨厌Singleton,因为他们如何使单元测试更加困难,但我发现这种方法表现更好比试图依赖Android的序列化机制更大的模型。
这是我的意思的一个非常粗略的例子(免责声明:我实际上没有测试过这段代码,但我希望这说明了这个概念):
你可能有一个我非常称为模型
的单例类public class Models {
private static Models instance;
private boolean isInitialized = false;
private User user;
private OtherInterestingModel otherInterestingModel;
private Models() {
}
public static synchronized Models getInstance() {
if (instance == null) {
instance = new Models();
}
return instance;
}
public void loadModels() {
if (!isInitialized) {
/*
* One-time model initialization here.
*/
isInitialized = true;
}
}
public User getUser() {
return user;
}
public OtherInterestingModel getOtherInterestingModel() {
return otherInterestingModel;
}
}
在您的LoginActivity中,您可以在onCreate()中初始化Models类:
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Models.getInstance().loadModels();
User user = Models.getInstance().getUser();
OtherInterestingModelData otherData = Models.getInstance().getOtherInterestingModel();
// Do something with the model data...
}
/*
* This might be called after the user enters data and clicks a login button...
*/
private void login() {
startActivity(new Intent(this, AwesomeLoggedInActivity.class));
}
}
用户成功登录您的应用后,您的主要活动中的代码基本相同:
public class AwesomeLoggedInActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Models.getInstance().loadModels();
User user = Models.getInstance().getUser();
OtherInterestingModelData otherData = Models.getInstance().getOtherInterestingModel();
// Do something with the model data...
}
}
请注意,通过使用Singleton,您可以避免必须通过传递启动主活动的intent来序列化模型数据。
答案 1 :(得分:1)
是的,您可以使用Parcelable
界面执行此操作。
实施Parcelable
界面时,不会丢失类的方法。界面只是定义了一种方法,用于在需要传递对象时将成员变量写入Parcel
对象。
通过getParcelableExtra()
从Intent中检索数据后,将从Parcel
重新创建对象,您可以再次将其视为任何类的实例。
例如,如果您有User
类扩展Parcelable
,则可以通过调用putExtra("user", myUser)
将其与Intent捆绑在一起。然后myUser
(在幕后)打包成一个包裹并附加到意图。在下一个活动中,您可以使用User myUser = (User) getParcelableExtra("user");
检索该用户对象,并且包裹将被解压缩并返回给您。你将再次拥有一个功能齐全的User对象。