2011-05-02 89 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上工作,并且被处理程序和按钮或另一个按钮调用处理程序,我应该声明它同步,对吗?