首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自SyncAdapter的领域错误线程错误

来自SyncAdapter的领域错误线程错误
EN

Stack Overflow用户
提问于 2016-08-07 18:26:07
回答 1查看 326关注 0票数 0

因此,我创建了一个非常标准的同步适配器(使用这个奇妙的教程),在onPerformSync期间,我在onPerformSync类中运行了一个名为syncDatastore的方法中的一些领域事务。问题是当同步适配器尝试执行同步时,我得到

java.lang.IllegalStateException:来自不正确线程的领域访问。只能在创建的线程上访问领域对象。

这是我的SyncAdapter的摘录

代码语言:javascript
复制
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    try {
        // Get the auth token for the current account
        String authToken = _accountManager.blockingGetAuthToken(account, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, true);

        // run network and database operations
        dataManager.syncDatastore();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

我用以下方法初始化应用程序类中的RealmConfiguration

代码语言:javascript
复制
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfiguration);

以及如何在我的DataManager中使用它的示例

代码语言:javascript
复制
private Realm realm = Realm.getDefaultInstance();

public void syncDatastore() {
    postResources();
    pushDataToServer();
    getDataFromServer();
}

private void postResources() {
    ArrayList<Client> clients = new ArrayList<>();
    clients.addAll(realm.where(Client.class).equalTo("isSynced", false).equalTo("apiId", "0").findAll());
    Log.e("clients count", String.valueOf(clients.size()));
    for (Client c : clients) {
        createClientResource(c);
    }
}

请注意,我尝试将android:process=":sync"从清单如本文所述中的服务声明中删除,但没有效果。我对SyncAdapters和领域也很陌生,所以任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2016-08-07 19:33:23

领域实例是线程受限的,因此您需要在后台线程(同步正在发生的后台线程)上创建一个新的领域实例。

代码语言:javascript
复制
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();
        // Get the auth token for the current account
        String authToken = _accountManager.blockingGetAuthToken(account, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, true);

        // run network and database operations
        dataManager.syncDatastore(realm);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(realm != null) {
            realm.close();
        }
    }
}

public void syncDatastore(Realm realm) {
    postResources(realm);
    pushDataToServer();
    getDataFromServer();
}

private void postResources(Realm realm) {
    RealmResults<Client> clients = realm.where(Client.class).equalTo("isSynced", false).equalTo("apiId", "0").findAll();
    Log.e("clients count", String.valueOf(clients.size()));
    for (Client c : clients) {
        createClientResource(c);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38817218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档