使android活动方法线程安全

使android活动方法线程安全,android,Android,我有一个activity的updatefo()方法,每5秒从处理程序线程调用一次,当用户想按它时从按钮调用一次。。。updateFoo更新我的活动的界面。。。为了使这个方法线程安全,我声明它为“synchronized”。。。这是正确的方法吗?标记一个方法synchronized是一种使其线程安全的方法——基本上,它使方法在任何给定时间只能有一个线程 但是,这可能不是最好的选择,因为如果updateFoo()执行一些长时间运行的操作,您的UI线程可能会挂起(即,按下按钮可能会在等待进入[并执行]

我有一个activity的updatefo()方法,每5秒从处理程序线程调用一次,当用户想按它时从按钮调用一次。。。updateFoo更新我的活动的界面。。。为了使这个方法线程安全,我声明它为“synchronized”。。。这是正确的方法吗?

标记一个方法
synchronized
是一种使其线程安全的方法——基本上,它使方法在任何给定时间只能有一个线程

但是,这可能不是最好的选择,因为如果
updateFoo()
执行一些长时间运行的操作,您的UI线程可能会挂起(即,按下按钮可能会在等待进入[并执行]
updateFoo()
时卡住)

更细粒度的方法是使用锁或一些Java的其他线程选项。如果您将代码发布到方法中,我们将能够找到更好的解决方案。

使用处理程序:是线程安全的。您可以在此处查看教程:
我建议您在线程中进行长时间的计算,并从处理程序(在主线程中创建)更新UI从工作线程调用。

如果使用消息传递并发,则不必太担心并发冲突。为此,您需要传递一个不可变对象来启动线程,线程不会读取或写入线程外的任何共享内存,然后线程将返回一个不可变对象


如果您使用共享内存通信,IMHO,简单地声明您的方法已同步可能不足以实现线程安全。如果该方法反过来访问非线程安全、原子等的共享内存,则可能存在并发冲突。

谢谢大家的回答:)我尝试了这段代码,比我正在构建的项目更简单:

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。。按钮也会更新文本视图

无论是使用同步的in-update_text函数还是不使用它,所有这些都似乎都能很好地工作…我认为这是因为update_text在UI上工作,因此处理程序具有独占访问权限,并在有人调用update_text时等待。但是如果该函数在UI上不工作,并且由处理程序和按钮或其他处理程序调用,我应该声明它是同步的,对吗