2015-10-13 2 views
0

Я пытаюсь реализовать поточно-безопасные операции в 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. Я не уверен.

+0

Ваш журнал выхода находится вне блока. Его можно распечатать в любое время, не по порядку. –

+0

О, вы правы, но это ошибка при написании вопроса, выход журнала действителен – ILovemyPoncho

+0

Я сомневаюсь. Скорее, та же ошибка в коде. Убедитесь, что вы используете код, который, как вы думаете, работает. – EJP

ответ

0

Я думаю, вы можете использовать MemoryFile для синхронизации между процессами.

  1. использование 2 общий память общийmemory1, разделенныйmemory2.

  2. process1 только для чтения sharedmemory1 и писать только sharedmemory2. process2 read only sharedmemory2 и писать только sharedmemory1.

  3. Любой процесс должен написать sharedmemory, который он может сначала написать, а затем проверить sharedmemory, который он может прочитать, прежде чем процесс захочет написать поле синхронизации.

Я не уверен, является ли это предложение эффективным. Просто идея, надеюсь помочь вам.

Смежные вопросы