使android活动方法线程安全

时间:2011-05-02 23:59:59

标签: android

我有一个活动方法updateFoo(),每隔5秒从一个Handler线程调用一次,当用户想要按下它时从一个按钮调用... updateFoo更新我的活动的界面...来制作这个方法线程安全我宣布它“同步”......这是正确的方式???

4 个答案:

答案 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并由处理程序和按钮或其他处理程序调用,我应该声明它同步,对吧?