非常に標準の同期アダプタ(this fantastic tutorialを使用)を作成し、onPerformSync
の中でDataManager
クラス内のsyncDatastore
というメソッドで領域トランザクションを実行します。問題は、同期アダプタが同期を実行しようとしたときです。RealAdのSyncAdapterからの不正なスレッドエラー
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();
}
}
私は私のApplicationクラスで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);
}
}
注意マニフェストas outlined hereのサービス宣言からandroid:process=":sync"
を削除しようとしましたが、役に立たないことに注意してください。私はSyncAdaptersとRealmの両方にも非常に新しいので、どんな助けでも大歓迎です。
。のfindAll ());「元気?それはどこで初期化されますか? – EpicPandaForce
「DataManager」 –
で私の編集を見てください。あなたのDataManagerはある時点でアプリケーションとともにインスタンス化されます。そのため、それに属するレルムはUIスレッド上にあります。意味をなさないそれは動作しません。 – EpicPandaForce