在循环中使用Realm或在Android中插入列表

问题描述 投票:2回答:1

美好的一天。我有一个问题。

首先,在我看来,一个很好的数据库用于存储本地数据,我已经开发了一个社交网络,我在本地和每个应用程序保存消息开始我从服务器下载消息,以便在本地保存它们让我们说当前要使用的会话。 Realm似乎是开箱即用的最佳解决方案但是我遇到了由于Realm事务而阻止我的UI的情况。以下是案例。

•我必须使用UI线程中的Realm对象,否则它将抛出异常,说我需要从我调用的线程访问该对象,因此在这种情况下,来自领域的executeTransactionAsync将无法正常工作发生在UI线程上

•这是第一次这样的问题,但我想象自己为什么以前不是一个问题,因为我的mesasges不是那么多,现在我有40条消息和哇...领域阻止UI真的很可怕(仅约4秒)这是pathethic。

•我已经尝试运行领域实际事务和我在一个单独的线程中调用的方法,但是这不会有效,因为必须从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线程

我在循环中调用这个方法,我得到了消息数组,就是这样,有什么帮助吗?

java android multithreading realm
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.