我在扩展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直接附加到Realm
,RealmResults
和RealmObject
,没有任何作用。
该应用程序具有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];
}
答案 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();