如何在android中的多个活动之间保持模型?

时间:2014-02-10 20:29:17

标签: android android-intent model-view-controller model

我是Android开发的初学者,我正在尝试用MVC模式编写代码,但是我无法理解模型的工作原理。据我所知,每次你开始一个有意图的新活动时,你都无法传递模型。据我所知,每次开始新活动时都必须重新初始化它。我错过了什么吗?我查看了Parcelable,但是如果你让你的模型Parcelable你似乎放松了你的方法。现在我正在构建一个登录系统,如果用户已经登录,它将在启动时检查我的本地sqllite数据库,如果是,则传递给另一个活动,否则它将传递给登录活动,但我想通过所有活动使该用户模型保持活跃状态​​。你是这样做的吗?

2 个答案:

答案 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对象。