[英]How to update Realm in several threads in Android?
好吧,这是我的“不那么记忆效率”的解决方案:
从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.