Я пытаюсь реализовать поточно-безопасные операции в Android. Я использую SyncAdapter
для отправки данных на сервер. Проблема в том, что пользователь может изменять те же данные, которые отправляются после отправки данных, я сравниваю текущие сохраненные данные (возможно, измененные) с тем, который был только что отправлен.многопоточный доступ к синхронизированному оператору
Я хочу, чтобы избежать этого:
(SyncAdapter thread) - data sent to server
(SyncAdapter thread) - comparing data
(SyncAdapter thread) - result: the data was not modified
(UI thread) - main thread updates the database
(SyncAdapter thread) - set the data to a sent state.
Теперь база данных содержит данные, которые не собираются быть отправлены
Чтобы решить, что я реализовал синхронизированный заявление. Прежде всего это мой замок:
public class Lock {
public final static Lock lock = new Lock();
private Lock() {}
}
Это код из SyncAdapter.onPerformSync()
, как вы можете видеть сон нить, чтобы быть в состоянии проверить это:
synchronized (Lock.lock) {
Log.d(TAG, "inside synchronized block...");
if (isDataUnchanged()) {
Log.d(TAG, "data compared...");
Thread.sleep(5000);
// update data state to 'sent'
provider.update(mUri, cValues, null, null);
}
Log.d(TAG, "exits synchronized block...");
}
из UIThread что-то подобное:
synchronized (Lock.lock) {
Log.d("UIThread", "inside synchronized");
...
getActivity().getApplicationContext().getContentResolver().update(uri, cv, null, null);
}
Но когда я его тестирую, я вижу, что UIThread входит в синхронизированный оператор, если это не так. Или, по крайней мере, это то, что я ожидаю, поскольку блокировка для обоих операторов одинакова.
D/SyncAdapter﹕ inside synchronized block...
D/SyncAdapter﹕ Data is the same
D/SyncAdapter﹕ data compared...
D/UIThread﹕ inside synchronized
D/SyncAdapter﹕ exits synchronized block...
Редактировать
нормально, думаю, что я получил его, я просто понимаю, что SyncAdapter работает в отдельном процессе, чем приложение. Это должно быть причиной того, что замки не совпадают.
[email protected]
[email protected]
Edit 2
приложение и SyncAdapter работает в различных процессах было причиной. Я перенесла выполнение SynAdapter в процесс приложения, изменив атрибут android:process SyncAdapter Service
, теперь синхронизированные блоки работают должным образом.
Я бы хотел знать, есть ли способ синхронизации между процессами, потому что это было бы лучше для назначенной памяти приложения. Возможно, передача замка адаптеру в комплекте, но я не уверен, что это сработает, или, может быть, AIDL, Messenger. Я не уверен.
Ваш журнал выхода находится вне блока. Его можно распечатать в любое время, не по порядку. –
О, вы правы, но это ошибка при написании вопроса, выход журнала действителен – ILovemyPoncho
Я сомневаюсь. Скорее, та же ошибка в коде. Убедитесь, что вы используете код, который, как вы думаете, работает. – EJP