繁体   English   中英

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

[英]How to update Realm in several threads in Android?

我试图更新几个线程的领域实例。 而不是解释所有我创建流程图,因为我理解它。

这里是: 在此输入图像描述

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

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

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

然后是WidFactory类:

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();     }
    }
}

这个解决方案的坏处是我打开和关闭了3次:在onCreate()onDatasetChanged()getViewAt() 更糟糕的是,一般来说我只需要一个面向所有小部件的领域实例,所以我想在工厂构造函数中传递领域,因此所有工厂都使用一个领域。 但出现了2个问题:
1)我不知道如何从服务启动时“更新”领域实例; Android不提供任何方法。
2)我不确定内容提供程序是如何工作的,但是工厂类以某种方式将工作分散到多个线程上,而Realm不喜欢这样。 一点也不。
PS请纠正我,如果我错了,我对Android和Realm相对较新。
再次感谢您的回复:) @G。 Blake Meike

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM