【问题标题】:how can i persist a model between multiple activities in android?如何在 android 的多个活动之间保持模型?
【发布时间】:2014-03-08 09:03:28
【问题描述】:

我是 android 开发的初学者,我正在尝试以 MVC 模式编写代码,但我无法理解模型的工作原理。据我所知,每次你带着一个意图开始一个新的活动时,你都无法传递一个模型。据我所知,您每次开始新活动时都必须重新初始化它。我错过了什么吗?我研究了 Parcelable,但如果你让你的模型 Parcelable,你似乎会失去你的方法。现在我正在构建一个登录系统,如果用户已经登录,它会在启动时检查我的本地 sqllite 数据库,如果是这样,它会传递给另一个活动,否则它会传递给登录活动,但我想要t 在所有活动中保持该用户模型的活力。你有办法做到这一点吗?

【问题讨论】:

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


    【解决方案1】:

    您可能还需要考虑保留对要跨活动共享的模型数据的静态引用,以便在活动之间切换时不必继续对模型进行序列化/反序列化。如果您的模型很小,您可以使用 Parcelable,但在某些时候,性能可能会成为问题。

    我正在做一个项目,我们将模型保存在一个可以在整个应用程序中访问的单例中,尽管我通常讨厌单例,因为它们会使单元测试变得更加困难,但我发现这种方法表现得更好使用更大的模型而不是尝试依赖 Android 的序列化机制。

    这是我的意思的一个非常粗略的例子(免责声明:我没有实际运行测试过这段代码,但我希望这能说明这个概念):

    你可能有一个单例类,我把它叫做 Models

    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 中,你可以初始化 Models 类,比如在你的 onCreate() 中:

    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,您避免了通过将模型数据传递给启动主要活动的意图来序列化模型数据。

    【讨论】:

    • 非常有趣...你能不能给我举个例子?或者至少为我指明了如何实现这样的事情的正确方向?
    • 非常好。这种实现对于大量数据显然更有意义。感谢您的示例代码......这有很大帮助。而且在许多方面,它似乎更容易实现。
    【解决方案2】:

    是的,您可以使用Parcelable 接口来做到这一点。

    当您实现Parcelable 接口时,您不会丢失类的方法。该接口只定义了一种方法,用于在您需要传递对象时将成员变量写入Parcel 对象。

    一旦您通过 getParcelableExtra() 从 Intent 检索数据,该对象将从 Parcel 重新创建,您可以再次将其视为任何类的实例。

    例如,如果您有一个扩展 ParcelableUser 类,则可以通过调用 putExtra("user", myUser) 将其与 Intent 捆绑在一起。 myUser 然后(在幕后)被打包到一个 Parcel 中并附加到 Intent 上。在您的下一个活动中,您可以使用User myUser = (User) getParcelableExtra("user"); 检索该用户对象,包裹将被解包并返回给您。您将再次拥有一个功能齐全的 User 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多