簡體   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