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

标签 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 直接附加到 Realm , RealmResultsRealmObject ,没有任何作用。

该应用程序具有例如 RealmResults<myRealmObject>.size() 的简单 rcl和 几个 RecyclerAdapter 和里面的 rcl RealmRecyclerViewAdapter永远不会被调用。

然而,重新运行查询是有效的,“丢失的数据”出现了。 此外,如果在 ui- 或任何其他线程上插入了任何内容,则会调用 rcl 并显示“丢失数据”。

我在 Realm 0.88.3 上呆了几个月,因为我不能让它与任何更新的 Realm 版本一起工作。与 0.88.3 mRealm.refresh();在 NLService 中调用,这在较新版本和 .waitForChange 中不可用无限阻塞。

list .xml:

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

最佳答案

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


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

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

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

您可以使用包内部的东西通过与 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 更改了迭代行为,并且结果在 Activity 事务期间不再有效;但是从 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();

关于android - 在 NotificationListenerService 中更新 Realm 时,不会调用 RealmChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833163/

相关文章:

swift - 结果不正确的 Realm 结果对象(iOS,Swift)

由于 java.lang.NullPointerException,Android 应用程序在启动时崩溃

android - 如何让 Android Studio 指向我的 SDK 源代码?

ios - 无法将具有通用类型的类添加到 swift Realm

swift - 从 Realm 数组中查询特定结果

ios - 如何将图像存储到 Realm 数据库?

Android:bin/res/crunch 文件夹是做什么用的?

Linux 上的 Android SDK 工具 r12 更新

android向用户发送语音通知

ios - 实例化 Realm 对象时出现 EXC_BAD_INSTRUCTION