您好。我对境界有意见。
首先,在我看来,这是一个很好的数据库,可以用来存储本地数据,我已经开发了一个社交网络,在这里我在本地保存消息,每次应用程序启动时,我都会从服务器下载消息,将其保存在本地,比如说当前会话。Realm似乎是开箱即用的最佳解决方案,但我遇到了一个不好的情况,即我的UI因Realm交易而被屏蔽。以下是案例。
•我必须使用UI线程中的Realm对象,否则它会抛出异常,说我需要从我调用的线程中访问对象,所以在这种情况下,来自领域的executeTransactionAsync
将无法工作,因为仍然事务将实际发生在UI线程上
•这是第一次出现这样的问题,但我想我自己为什么以前不是问题,因为我的mesasges不那么多,现在我有大约40条信息,哇。。。领域阻塞UI真的很可怕(大约4秒),这是一种伦理。
•我曾尝试在一个单独的线程中运行领域实际事务和我调用的方法,但这当然不起作用,因为最后必须从UI线程访问realm对象,所以后台线程根本没有运气。
所以我来这里是为了寻求帮助,如果有人能帮忙的话?
这是领域方法的代码
public void insertMessage(final String userId, final String opponentId, final String message,
final String messageId, final String date,
final String id, final String deliveryStatus,
final String userImage,
final String opponentImage, final String deleteOpponentId,
final String deleteUserId,
final boolean hasGif, final String gifUrl, final boolean animated) {
if (!isMessageExist(messageId)) {
handler.post(new Runnable() {
@Override
public void run() {
}
});
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
MessageModel messageModel = realm.createObject(MessageModel.class);
messageModel.setId(id);
messageModel.setMessageId(messageId);
messageModel.setMessage(message);
messageModel.setUserId(userId);
messageModel.setOpponentId(opponentId);
messageModel.setAnimated(animated);
messageModel.setDeliveryStatus(deliveryStatus);
messageModel.setUserImage(userImage);
messageModel.setOpponentImage(opponentImage);
messageModel.setDate(date);
messageModel.setHasGif(hasGif);
messageModel.setGifUrl(gifUrl);
messageModel.setDeleteUserId(deleteUserId);
messageModel.setDeleteOpponentId(deleteOpponentId);
}
});
}
}
句柄是MainLooper
,此时基本上是UI线程
我在得到消息数组的循环中调用这个方法,就这样,有什么帮助吗?
只需在执行异步事务的另一个线程中创建您的领域实例,就可以开始了。
有用的样本
Realm android线程示例
相关问题
来自错误线程的领域访问