我有一個方法updateFoo()從一個處理程序線程每5秒調用一次,並從用戶按按鈕時按鈕... updateFoo更新我的活動的接口。 ..使這個方法線程安全我宣佈它「同步」......這是正確的方式?使android活動方法線程安全
回答
那麼使用處理程序:。http://developer.android.com/reference/android/os/Handler.html是線程安全的。你可以看看這裏的教程:http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/ 我建議您需要在線程中進行長時間計算,並從您的工作線程調用處理程序(在主線程中創建)的UI更新。
標記方法是一種使線程安全的方法 - 基本上它使得在任何給定時間只有一個線程可以在方法中。
然而,這可能不是最好的選擇,因爲如果updateFoo()
做一些長期運行的操作,你的UI線程都挺(即按下按鈕可能會陷入等待進入[和執行] updateFoo()
。
一個更精細的方法是使用鎖,或者一些Java的其他線程選項如果您發佈的代碼,你的方法,我們就可以找到一個更好的解決方案
如果使用消息傳遞併發性,則不必太擔心併發衝突。爲此,您需要傳遞一個不可變的對象來啓動線程,線程不會讀取或寫入線程外的任何共享內存,然後線程將返回一個不可變的對象。
如果您使用共享內存通信,恕我直言,簡單地聲明您的方法同步可能或可能不足以線程安全。如果IN TURN方法訪問非線程安全,原子等的共享內存,則可能存在併發衝突。
謝謝大家的答案:)我試過這個代碼,比項目更簡單,我的建築:
package provadroid.prova;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class AndroidSynch extends Activity {
private TextView text_to_view;
private Button change_text;
private static final Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.change_text = (Button)this.findViewById(R.id.change_button);
this.text_to_view = (TextView)this.findViewById(R.id.text_to_view);
this.change_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
AndroidSynch.this.updateText(" Button ");
}
});
doTheAutoRefresh(5000);
}
synchronized void updateText(String str)
{
this.text_to_view.setText(this.text_to_view.getText() + str);
}
void doTheAutoRefresh(long time) {
handler.removeMessages(0);
handler.postDelayed(new Runnable() {
@Override
public void run() {
AndroidSynch.this.updateText(" Handler ");
AndroidSynch.this.doTheAutoRefresh(5000);
}
}, time);
}
}
後臺處理程序每5秒後臺運行,該更新後的TextView。該按鈕更新文本視圖太...
所有似乎都工作良好,同步在update_text功能,沒有它...我想這是因爲update_text在UI上工作,所以處理程序有獨佔訪問權限,如果有人正在調用update_text ..但是如果函數不能在UI上工作,並且被處理程序和按鈕或另一個按鈕調用處理程序,我應該聲明它同步,對嗎?
- 1. 線程安全的方法
- 2. Java方法線程安全
- 3. 線程安全方法?
- 4. 使整個方法線程安全的最簡單方法?
- 5. 靜態方法和線程安全
- 6. 線程安全方法和堆棧
- 7. QTimer線程安全的方法'isActive()'?
- 8. 線程安全的Dispose方法?
- 9. Ruby類方法是否線程安全?
- 10. 方法參數線程安全嗎?
- 11. Java靜態方法和線程安全
- 12. 是靜態方法線程安全
- 13. 靜態方法和線程安全
- 14. 靜態方法的線程安全
- 15. IntentService的onStartCommand(..)方法線程安全嗎?
- 16. 線程安全類和方法參數
- 17. IEnumerable Linq方法是否線程安全?
- 18. 是靜態方法線程安全的
- 19. TrackingParticipant.Track方法線程安全>
- 20. 類方法和線程安全(NSJSONSerialization)
- 21. 此方法線程安全嗎?
- 22. 線程安全的IQueryable擴展方法
- 23. 此方法線程安全嗎?
- 24. 線程安全的方法setlocale()
- 25. Java:我的方法線程安全嗎?
- 26. 線程安全的UIKit方法
- 27. Spring服務方法線程安全
- 28. 線程安全和方法參數
- 29. SqlServer類靜態方法 - 線程安全
- 30. .NET - Queue.Enqueue方法線程安全嗎?