我有一个方法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. 线程安全方法?
- 3. 类方法和线程安全(NSJSONSerialization)
- 4. 线程安全的方法setlocale()
- 5. 静态方法和线程安全
- 6. 静态方法和线程安全
- 7. 线程安全get(访问器方法)
- 8. QTimer线程安全的方法'isActive()'?
- 9. .NET - Queue.Enqueue方法线程安全吗?
- 10. SqlServer类静态方法 - 线程安全
- 11. TrackingParticipant.Track方法线程安全>
- 12. 此方法线程安全吗?
- 13. 线程安全类和方法参数
- 14. 是静态方法线程安全
- 15. Java - 静态方法的线程安全
- 16. 线程安全的Dispose方法?
- 17. 线程安全和方法参数
- 18. 此方法线程安全吗?
- 19. 线程安全的UIKit方法
- 20. Android Studio:在主线活动的线程中调用方法
- 21. Android DownloadManager线程安全吗?
- 22. Android线程安全SharedPreferences
- 23. 安全的方法来停止线程 - Android
- 24. Android - 活动方法?
- 25. 这是LINQ动态orderby方法线程安全吗?
- 26. 如何使使用队列线程安全的异步方法
- 27. 使用线程安全或非线程安全的PHP?
- 28. 部分线程安全是否使Java类线程安全?
- 29. 线程安全
- 30. 线程安全