当Realm在NotificationListenerService中更新时,不会调用RealmChangeListener

时间:2016-08-08 15:29:02

标签: android realm

我在扩展NotificationListenerService上进行Realm插入,如下所示:

public class NLService extends NotificationListenerService {

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        // building realmObject here

        mRealm = Realm.getDefaultInstance();
        RealmHelper.saveObj(myRealmObject, mRealm);
    //  mRealm.waitForChange(); / mRealm.refresh();
        mRealm.close();
    }
}


public class RealmHelper {

    public static RealmModel saveObj(RealmObject realmObject, Realm realm) {
        realm.beginTransaction();
        RealmObject newRealmObject = realm.copyToRealm(realmObject);
        realm.commitTransaction();
        return newRealmObject;
    }
}

使用比v0.88.3更新的Realm,如果RealmChangeListener中插入了任何内容,则不会调用单个NLService rcl )。

我尝试将rcl直接附加到RealmRealmResultsRealmObject,没有任何作用。

该应用程序具有RealmResults<myRealmObject>.size()RealmRecyclerViewAdapter的简单rcl 从不调用几个RecyclerAdapters和mRealm.refresh();内的rcl。

然而,重新运行查询可以正常工作并且缺少数据&#34;出现。 此外,如果在ui-或任何其他线程上插入任何内容,则会调用rcl并且&#34;丢失数据&#34;出现了。

我在Realm 0.88.3上呆了好几个月,因为我无法使用任何更新的Realm版本。在NLService中调用了0.88.3 .waitForChange,这在新版本和<service android:name=".service.NLService" android:label="@string/nl_service" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService"/> </intent-filter> </service> 块中无法使用。

的Manifest.xml:

$scope.GetCollectionName = function (CollId) {

  if(!$scope.someDataCheck[CollId] && !$scope.someData[CollId]){
$scope.someDataCheck[CollId] = true;
$http.get('http://Server/App/api/GetCollName/' + CollId).
  then(function (result) {
        $scope.someDataCheck[CollId] = false;
        $scope.someData[CollId].data = result.data;
   });
 }

  return $scope.someData[CollId];
}

1 个答案:

答案 0 :(得分:14)

我可以看到两个解决方案,要么使用looper线程(HandlerThread)和setAutoRefresh(true)(并在setAutoRefresh(false)之前调用Looper.quit()),要么强制刷新Realm实例线程。

注意:这依赖于包内部方法。当心。

在v 1.1.1(和v1.2.0)中, - 和3.0.0之前的任何版本 - 而不是以下行

//  mRealm.waitForChange(); / mRealm.refresh();

您可以使用package-internal stuff强制通过与Realm实例关联的HandlerController更新本地线程

package io.realm;

public class RealmRefresh {
    public static void refreshRealm(Realm realm) {
        Message message = Message.obtain();
        message.what = HandlerControllerConstants.LOCAL_COMMIT;
        realm.handlerController.handleMessage(message);
    }
}

然后致电

    mRealm = Realm.getDefaultInstance();
    RealmHelper.saveObj(myRealmObject, mRealm);
    RealmRefresh.refreshRealm(mRealm);
    mRealm.close();

请注意更改日志的重大更改,因为0.89.0更改了迭代行为,并且在活动事务期间结果不再存在;但是从3.0.0开始他们又来了。

但是,我还必须注意,如果您的NotificationListenerService正在远程进程中运行,那么Realm实例将无法相互通知。

修改

在Realm Java 3.0.0中,通知行为已完全更改,HandlerController不再存在。

相反,以下内容应该有效:

package io.realm;

public class RealmRefresh {
    public static void refreshRealm(Realm realm) {
        realm.sharedRealm.refresh();
    }
}

修改

在Realm 3.2。+中,

可以使用
realm.refresh();