如何在Android中的多个线程中更新Realm?

时间:2017-07-21 11:38:39

标签: java android multithreading realm flowchart

我正在尝试更新多个线程的realm实例。而不是解释所有我创建流程图,因为我理解它。

这是:enter image description here

所以问题是当我调用notifyAppWidgetViewDataChanged()时它不会更新领域。我尝试在服务Realm.OnChangeListener中添加onCreate(),但是在从主线程更改域时不会调用该方法。我还尝试从服务getDefaultRealmInstance()拨打onGetViewFactory()。同样的问题。

1 个答案:

答案 0 :(得分:0)

好吧,这是我的“不那么记忆效率”的解决方案:
从Widget的服务中,我只覆盖一个创建工厂实例的方法:

from

@NgModule({
      imports:      [ BrowserModule, MaterialModule],
to

 @NgModule({
      imports:      [ BrowserModule, MaterialModule.forRoot()],

然后是WidFactory类:

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    return new WidFactory(getApplicationContext());
}

这个解决方案的坏处在于我打开和关闭领域3次:class WidFactory implements WidService.RemoteViewsFactory { private static int myTasksSize; private Context context; private Realm realm; private RealmResults<Task> myTasks; WidFactory(Context context){ this.context = context; } @Override public void onCreate() { realm = Realm.getDefaultInstance(); myTasks = realm.where(Task.class).findAll(); myTasksSize = myTasks.size(); realm.close(); } @Override public void onDataSetChanged() { realm = Realm.getDefaultInstance(); realm.refresh(); myTasks = realm.where(Task.class).findAll(); myTasksSize = myTasks.size(); realm.close(); } @Override public RemoteViews getViewAt(int position) { realm = Realm.getDefaultInstance(); myTasks = realm.where(Task.class).findAll(); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widgetrow_layout); final Task myTask = myTasks.get(position); rv.setTextViewText(R.id.widgetrow_text_id, myTask.getTaskText()); Intent fillInIntent = new Intent(context, WidShowTaskActivity.class); fillInIntent.putExtra("code", myTask.getCode()); realm.close(); rv.setOnClickFillInIntent(R.id.widgetrow_text_id, fillInIntent); return rv; } @Override public int getCount() { return myTasksSize; } @Override public RemoteViews getLoadingView() { return null; } @Override public int getViewTypeCount() { return 1; } @Override public long getItemId(int position) { return position; } @Override public boolean hasStableIds() { return true; } @Override public void onDestroy() { if (!realm.isClosed()){ realm.close(); } } } onCreate()onDatasetChanged()。更糟糕的是,一般来说我只需要一个面向所有小部件的领域实例,所以我想在工厂构造函数中传递领域,因此所有工厂都使用一个领域。但出现了两个问题:
1)我不知道如何从服务启动时“更新”领域实例; Android没有提供任何方法 2)我不确定内容提供程序是如何工作的,但是工厂类以某种方式将工作分散到多个线程上,而Realm不喜欢这样。完全没有。
附:如果我错了,请纠正我,我对Android和Realm相对较新 再次感谢您的回复:) @G。 Blake Meike