java - Android 设计模式,Realm 中用于组合的单例对象类?

标签 java android multithreading design-patterns realm

我正在 realm 中设计一个 android 应用程序,它使用非常直接的对象类表示法以图形方式绘制数据图表:

@RealmClass
public class Graph implements RealmModel {
  @PrimaryKey
  private String UUID;
  public RealmList<DataSet> dataSets;
}

@RealmClass
  public class DataSet implements RealmModel {
  @PrimaryKey
  private String UUID;
  public RealmList<DataPoint> dataPoints;
}

@RealmClass
  public class DataPoint implements RealmModel {
  private String UUID;
}

 Basically Graph.Contains DataSets.Contains DataPoints

我想在它自己的线程中运行 Realm ,与 UI 分开。我正在考虑使用 Singleton 设计模式来管理所有 3 个级别的数据。每个 Realm 模型可能有 1 个单例,总共有 3 个单例,或者可以有一个主单例。

在这两种情况下,单例都将使用 RealmModel 提供的传统 sup'd List 方法,

    realm.executeTransaction(new Realm.Transaction(){
        @Override
        public void execute(Realm realm){
            realm.copyToRealm(graph);
        }
    });

连同我创建的其他方法:

public void bulkAdd() {
        @Override
        public void execute(Realm realm){
            for(int i=0; i<100;i++){
                //doStuff();
...      });

在该操作之前/之后,我想使用工厂模式来管理创建和配置每个 RealmModel 的细节。所以我的问题是,我应该创建 3 个单例,每个 RealmModel 一个实例,1 个管理所有 RealmModel 的主单例,还是使用其他设计模式?

旁注,非优先事项是,如果可能的话,我也想利用异步,即:

    private void asyncAddQuote() {
    ...
    AsyncTask<Void, Void, Void> remoteItem = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {...

但我不知道哪种设计模式的整体组合最适合这个应用程序。我需要记住,Realm 事务仅限于一个线程。我需要在 UI 线程中驱动像 RecyclerView 这样的 UI 元素。在某些模式下,应用程序作为服务运行,因此在服务模式下,我的 Realm 需要在服务线程上。

我已经将 Graph 单例构建到 recyclerview 级别,我将构建其余部分。我想在编码合成/控制层时避免陷入困境。如果您对整体构图的设计模式和选项有想法,我将不胜感激。谢谢!

最佳答案

您可以拥有一个生产不同 POJO(图形/数据集和数据点)的工厂,然后使用 async transaction使用 bulk insert 将一批对象插入 Realm:

realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                Graph graph = MyFactory.INSTANCE.getGraph();
                bgRealm.insert(graph);
            }
        });

您还可以使用异步事务来查询先前从后台线程添加的对象:

 RealmResults<Graph> graphs = realm.where(Graph.class).findAllAsync();
 graphs.addChangeListener(new RealmChangeListener<RealmResults<Graph>>() {
                    @Override
                    public void onChange(RealmResults<Graph> graphs) {
                        //update UI
                    }
                });

请注意:不要将 Realm 本身放在单例中,拥有单例意味着无论您从何处访问数据(在您的情况下是 Realm),它都会返回与 threading model 相同的实例。境界。 Realm 实例已经是线程限制的 (ThreadLocal),即当从同一个线程访问时它将返回同一个实例。

关于java - Android 设计模式,Realm 中用于组合的单例对象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731461/

相关文章:

multithreading - 我应该如何为并行计算生成线程?

java - 编写一个 Car 类,其构造函数接受yearModel、品牌和速度(以 MPH 为单位)作为参数

java - 如何使用Google Fit API记录客户端进行数据类型.TYPE_LOCATION_SAMPLE的后台收集?

android - TextView 填充点

android - 多个 Libstreaming 流仅被识别为第一个 RTSP 客户端的 session

c++ - 队列和线程池之间的交互?

java - Java 中的替代 NSSortDescriptor 是什么?

java - 程序不重新绘制?

java - 在 Android 上运行时,来自网页的 Httpget 不会返回内容

java - 如何创建 Cassandra ITrigger 析构函数?