因此,我创建了一个非常标准的同步适配器(使用这个奇妙的教程),在onPerformSync期间,我在onPerformSync类中运行了一个名为syncDatastore的方法中的一些领域事务。问题是当同步适配器尝试执行同步时,我得到
java.lang.IllegalStateException:来自不正确线程的领域访问。只能在创建的线程上访问领域对象。
这是我的SyncAdapter的摘录
@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:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfiguration);以及如何在我的DataManager中使用它的示例
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和领域也很陌生,所以任何帮助都是非常感谢的。
发布于 2016-08-07 19:33:23
领域实例是线程受限的,因此您需要在后台线程(同步正在发生的后台线程)上创建一个新的领域实例。
@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);
}
}https://stackoverflow.com/questions/38817218
复制相似问题