我正在尝试更新多个线程的realm实例。而不是解释所有我创建流程图,因为我理解它。
所以问题是当我调用notifyAppWidgetViewDataChanged()
时它不会更新领域。我尝试在服务Realm.OnChangeListener
中添加onCreate()
,但是在从主线程更改域时不会调用该方法。我还尝试从服务getDefaultRealmInstance()
拨打onGetViewFactory()
。同样的问题。
答案 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