在Android中使用共享ViewModel在不同ViewModel之间共享数据

在Android中使用共享ViewModel在不同ViewModel之间共享数据,android,mvvm,Android,Mvvm,我有多个片段,每个片段都有一个不同的ViewModel。现在,我想避免将数据作为片段之间的参数传递,而是在视图模型之间使用共享视图模型,并以某种方式继承共享视图模型,以更新数据状态。有什么帮助吗?ViewModel继承可能是用于此目的的错误工具,因为ViewModel被设计为绑定到特定片段或活动的生命周期。更好的方法是使用一个真正的“模型”类来管理各个ViewModels接口的持久数据状态(单例或其他)。例如: class Database { private static Datab

我有多个片段,每个片段都有一个不同的
ViewModel
。现在,我想避免将数据作为
片段
之间的参数传递,而是在
视图模型
之间使用
共享视图模型
,并以某种方式继承
共享视图模型
,以更新数据状态。有什么帮助吗?

ViewModel继承可能是用于此目的的错误工具,因为ViewModel被设计为绑定到特定片段或活动的生命周期。更好的方法是使用一个真正的“模型”类来管理各个ViewModels接口的持久数据状态(单例或其他)。例如:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}
mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);
另一个选项是创建活动级别的ViewModel。如果所有片段都在同一个活动中,则它们可以共享该活动ViewModel。例如:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}
mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);

ViewModel继承可能是用于此目的的错误工具,因为ViewModel被设计为绑定到特定片段或活动的生命周期。更好的方法是使用一个真正的“模型”类来管理各个ViewModels接口的持久数据状态(单例或其他)。例如:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}
mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);
另一个选项是创建活动级别的ViewModel。如果所有片段都在同一个活动中,则它们可以共享该活动ViewModel。例如:

class Database {

    private static Database instance = null;

    public static synchronized Database getInstance() {
        if( instance == null ) {
            instance = new Database();
        }
        return instance;
    }

    private Database() {}

    private int mValue = 0;
    public void setValue(int v) { mValue = v; }
    public int getValue() { return mValue; }
}


class FragmentAViewModel extends ViewModel {

    private final Database db;

    FragmentAViewModel() {
        db = Database.getInstance();
    }

    // FragmentA can set and get state on Database as needed
    void setValue(int v) {
        db.setValue(v);
    }
}

class FragmentBViewModel extends ViewModel {

    private final Database db;

    FragmentBViewModel() {
        db = Database.getInstance();
    }

    // FragmentB can set and get state on Database as needed
    int getValue() {
        return db.getValue();
    }
}
mFragmentViewModel = ViewModelProviders.of(this).get(FragmentViewModel.class);

MainActivity a = (MainActivity)requireActivity();
mActivityViewModel = ViewModelProviders.of(a).get(MainActivityViewModel.class);

我听说一个片段可以有一个sharedviewmodel和一个私有viewmodel,这是由viewmodel提供者提供的。。我只是不知道如何实现,我听说一个片段可以有一个sharedviewmodel和一个私有viewmodel,这是由viewmodel提供者提供的。。我只是不知道如何实现我试图避免使用repositories如果您试图创建一个超过给定片段或活动生命周期的类,那么这就是您所描述的。ViewModel是一个生命周期感知组件。我试图避免使用Repositories如果您试图创建一个超过给定片段或活动生命周期的类,那么这就是您所描述的。ViewModel是一个生命周期感知组件。