Злоупотребление синхронизировано? - PullRequest
0 голосов
/ 19 мая 2011

Я пытаюсь синхронизировать два блока кода для приложения Android.

Первый блок использует AsyncFacebookRunner для запроса интересов пользователя, если таковые имеются.

Если интересы были найдены, переменная-член для этого пользователя заполняется его интересами из Facebook JSON.response.

Второй блок кода проверяет, действительно ли у пользователя есть интересы, просматривая эту переменную-член.Если есть интересы, выполняется несколько дополнительных строк кода.

synchronized(this)
{
    if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
        friend.requestInterests(mFacebook); // Get that friend's Facebook activities and interests.
}

synchronized(this)
{
    if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
    {
        final AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
        alertDialog.setTitle("Sorry...");
        alertDialog.setMessage("Your friend isn't sharing their interests.");
        alertDialog.setButton("Go Back", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                alertDialog.dismiss();
            }
        });

        alertDialog.show();
    }
}

Я хочу, чтобы второй блок дождался завершения friend.requestInterests () перед выполнением.

EDITЯ закончил реструктуризацию своего кода, чтобы использовать метод onComplete бегуна.Все это произошло, когда я изменил структуру своей программы и должен был изменить все.Спасибо всем за помощь.

1 Ответ

1 голос
/ 19 мая 2011

Я хочу, чтобы второй блок дождался завершения friend.requestInterests () перед выполнением.

JVM гарантирует, что два блока не будут выполняться одновременно для одного и того же экземпляра this .

Если вы дополнительно хотите убедиться, что второй блок запускается только после первого запуска, то вы можете сделать это, используя переменную состояния и wait / notify звонки. Но лучше всего использовать один из классов синхронизации, например CountDownLatch; например,

private CountDownLatch latch = new CountDownLatch(1);

...

synchronized(this) {
   // do first actions
}
this.latch.countdown();

....

this.latch.await();
synchronized(this) {
    // do second
}

Действительно, если это единственные места, где происходит доступ к соответствующему состоянию объекта и его обновление, вы можете обойтись без блоков synchronized. Вызовы countdown и await обеспечат необходимые отношения "до", чтобы обеспечить правильную синхронизацию.


Тем не менее, комментарий @ pst поднимает вопрос о том, что может быть лучший способ сделать это, используя API библиотеки Facebook, которые использует ваш код.

...