2011-05-02 69 views
5

我有一個方法updateFoo()從一個處理程序線程每5秒調用一次,並從用戶按按鈕時按鈕... updateFoo更新我的活動的接口。 ..使這個方法線程安全我宣佈它「同步」......這是正確的方式?使android活動方法線程安全

回答

1

標記方法​​是一種使線程安全的方法 - 基本上它使得在任何給定時間只有一個線程可以在方法中。

然而,這可能不是最好的選擇,因爲如果updateFoo()做一些長期運行的操作,你的UI線程都挺(即按下按鈕可能會陷入等待進入[和執行] updateFoo()

一個更精細的方法是使用鎖,或者一些Java的其他線程選項如果您發佈的代碼,你的方法,我們就可以找到一個更好的解決方案

0

如果使用消息傳遞併發性,則不必太擔心併發衝突。爲此,您需要傳遞一個不可變的對象來啓動線程,線程不會讀取或寫入線程外的任何共享內存,然後線程將返回一個不可變的對象。

如果您使用共享內存通信,恕我直言,簡單地聲明您的方法同步可能或可能不足以線程安全。如果IN TURN方法訪問非線程安全,原子等的共享內存,則可能存在併發衝突。

0

謝謝大家的答案:)我試過這個代碼,比項目更簡單,我的建築:

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上工作,並且被處理程序和按鈕或另一個按鈕調用處理程序,我應該聲明它同步,對嗎?