您的领域是从没有Looper的线程打开的

时间:2016-11-05 05:54:50

标签: android realm

我以为我遵循推荐的Realm方法来运行像这样的异步数据插入:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="responsive1">
     <div class="pop_background"></div>
    <div class="pop_box">
      <h1>POP1</h1>
        <span class="close">&times;</span>
    </div>
      <div class="img">
        <a class="open" href="#">
          click to open pop
        </a>
       
      </div>
    </div>
    <div class="responsive1">
     <div class="pop_background"></div>
    <div class="pop_box">
      <h1>POP2</h1>
        <span class="close">&times;</span>
    </div>
      <div class="img">
        <a class="open" href="#">
          click to open pop2
        </a>
       
      </div>
    </div>

然而,当我运行上面的代码时,我得到了#34;你的领域是从一个没有Looper的线程打开的,你提供了一个回调,我们需要一个Handler来调用你的回调&#34;

我在非Activity类中运行此代码,我在这里做错了,我该如何解决它。感谢。

更新 - 已修复 事实证明,查询没有任何问题,问题是我是从IntentService调用它。我试图在应用程序第一次运行时播种数据库,所以我修复了这个:

public void addCustomer(final Customer customer) {
        Realm insertRealm = Realm.getDefaultInstance();
        insertRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm backgroundRealm) {
                long id = customerPrimaryKey.incrementAndGet();
                customer.setId(id);
                backgroundRealm.copyToRealm(customer);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                Log.d(LOG_TAG, "Customer Added");
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                Log.d(LOG_TAG, error.getMessage());
            }
        });

        insertRealm.close();

    }

修复后,在IntentService之外,从UI线程调用时,查询工作正常。

4 个答案:

答案 0 :(得分:2)

为了

insertRealm.executeTransactionAsync(new Realm.Transaction() {
      @Override
        public void execute(Realm backgroundRealm) {
            //...
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // !!!
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // !!!
        }
    });

要在后台线程上调用的异步事务回调,该线程需要与Looper相关联(因此具有可与该Looper的线程通信的Handler)。

解决方案,在后台线程上使用同步事务。

但是你已经知道了。

protected void onHandleIntent(Intent intent) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();
        final List<Customer> customers = SampleCustomerData.getCustomers();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                for (Customer customer: customers){
                    customer.setId(customerPrimaryKey.getAndIncrement());
                    realm.insert(customer);
                }
            }
        });
    } finally {
        if(realm != null) {
            realm.close();
        }
    }
}

答案 1 :(得分:1)

Realm依赖于Android&#39; Hanfler和Looper类的线程通信。 看起来你从另一个后台线程查询异步操作(为什么?,它已经在后台,使用同步版本)。 要解决此问题,您需要使用Active Looper的线程。使用Handler线程作为后台线程 - 它将初始化Looper

答案 2 :(得分:1)

您需要从UI线程调用 addCustomer

答案 3 :(得分:-1)

试试这一行

insertRealm.close();

onSuccessonError方法中添加。将它从当前的最后一行中删除。

所以你的代码看起来像

public void addCustomer(final Customer customer) {
        final Realm insertRealm = Realm.getDefaultInstance();
        insertRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm backgroundRealm) {
                long id = customerPrimaryKey.incrementAndGet();
                customer.setId(id);
                backgroundRealm.copyToRealm(customer);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                Log.d(LOG_TAG, "Customer Added");
                insertRealm.close();
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                Log.d(LOG_TAG, error.getMessage());
                insertRealm.close();
            }
        });
    }