我有一个活动方法updateFoo(),每隔5秒从一个Handler线程调用一次,当用户想要按下它时从一个按钮调用... updateFoo更新我的活动的界面...来制作这个方法线程安全我宣布它“同步”......这是正确的方式???
答案 0 :(得分:5)
使用Handler:http://developer.android.com/reference/android/os/Handler.html是线程安全的。您可以在此处查看教程:http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/ 我建议你在线程中进行长时间的计算,并从你的工作线程中调用Handler(在主线程中创建)的UI更新。
答案 1 :(得分:1)
标记方法synchronized
是一种使线程安全的方法 - 基本上它使得在任何给定时间只有一个线程可以在方法中。
但是,这可能不是最佳选项,因为如果updateFoo()
执行一些长时间运行的操作,那么您的UI线程可能会挂起(即按下按钮可能会卡住等待进入[并执行] updateFoo()
。
更细粒度的方法是使用锁或Java的其他一些线程选项。如果您将代码发布到您的方法,我们将能够找到更好的解决方案。
答案 2 :(得分:0)
如果使用消息传递并发,则不必过多担心并发冲突。要做到这一点,你将传递一个不可变对象来启动线程,线程不会读取或写入线程之外的任何共享内存,然后线程将返回一个不可变对象。
如果您使用共享内存通信,恕我直言,只是声明您的方法同步可能或可能不足以保证线程安全。如果IN TURN方法访问非线程安全,原子等的共享内存,则可能存在并发冲突。
答案 3 :(得分: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 ..按钮也会更新textview ...
所有似乎都在使用update in update_text函数并且没有它...我认为发生这种情况是因为update_text在UI上工作所以处理程序具有独占访问权并等待有人调用update_text ..但是如果函数不适用于UI并由处理程序和按钮或其他处理程序调用,我应该声明它同步,对吧?