0

我正在嘗試爲Android應用程序同步兩個代碼塊。濫用同步?

第一個塊使用AsyncFacebookRunner爲用戶的興趣提出請求(如果有的話)。

如果發現興趣,則該用戶的成員變量將使用Facebook JSON響應中的興趣填充。

第二個代碼塊通過查看該成員變量來檢查用戶實際上是否有興趣。如果有興趣,則會執行幾個額外的代碼行。

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()完成後再執行。

編輯:我結束了重構我的代碼,以利用亞軍的onComplete方法。這一切都是在我修改我的程序結構並不得不改變一切的時候出現的。感謝所有的幫助。

+1

AysncFacebookRunner *應該*支持回調。使用這些(如果它不,...找到一個更好的圖書館?:-)。然後,這只是對「完成」事件作出反應的問題,非常類似於正常的按鈕單擊或不按鈕。根據確切的細節(例如,線程是什麼線程),可能仍然需要「同步」。但是,這是一個糟糕的錯誤使用,可能甚至不能做到所期望的。考慮其他「基元」,例如互斥或信號量用於「非範圍」資源控制。 (另請參閱期貨等) – 2011-05-18 22:44:13

+0

這是事實。不過,我寧願在不使用回調的情況下執行此操作。我將不得不相當大地修改我的代碼的結構以利用onComplete。 – SemperFly 2011-05-18 22:50:56

回答

1

我希望第二個模塊等到friend.requestInterests()完成後再執行。

的JVM確保兩個塊不會在同一時間執行爲這個相同的實例。

如果另外要確保第二塊只得到第一運行後運行,那麼你可以使用這個狀態變量和wait/notify電話做。但更好的方法是使用其中一個同步類,如CountDownLatch;例如

private CountDownLatch latch = new CountDownLatch(1); 

... 

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

.... 

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

事實上,如果這些地方的相關對象狀態訪問和更新的唯一的地方,你應該能夠與​​塊進行分配。撥打countdownawait將提供必要的「前來」關係以確保正確的同步。


然而,@ PST的評論提出了一個點,有可能是一個更好的方式來做到這一點使用您的代碼使用Facebook的庫框架的API。