android线程处理程序消息传递

时间:2013-11-07 05:02:04

标签: android android-handler

我在网上找到了这个代码。我是一个新手,所以我不太了解java和android处理程序。我知道如何在处理程序中使用Runnables来发布ui线程。但是在这段代码中使用handler.sendMessage(handler.obtainMessage)我没有得到它。我也对atomic booleanboolean之间的区别感到困惑。所以请夸大一下。感谢帮助。

package com.example.watch;
import java.util.Calendar;
import java.util.concurrent.atomic.AtomicBoolean;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {

    TextView watch;
    AtomicBoolean ContinueThread = new AtomicBoolean(false);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        watch = (TextView) findViewById(R.id.txtWatch);
        displayCurrentTime();
    }

    public void displayCurrentTime() {

        Calendar c = Calendar.getInstance();
        // String curTime = String.valueOf(c.getTime());
        int hours = c.get(Calendar.HOUR);
        int minutes = c.get(Calendar.MINUTE);
        int seconds = c.get(Calendar.SECOND);
        String curTime = hours + ":" + minutes + ":" + seconds;
        watch.setText(curTime);
    }

    public void onStart() {
        super.onStart();
        Thread background = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    while(ContinueThread.get()) {
                        Thread.sleep(1000);
                        handler.sendMessage(handler.obtainMessage());
                    }
                } catch (Throwable t) {

                }

            }

        });
        ContinueThread.set(true);
        background.start();
    }
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            displayCurrentTime();
        }
    };
    public void onStop() {
        super.onStop();
        ContinueThread.set(false);
    }

}

2 个答案:

答案 0 :(得分:1)

如果您希望代码在UI线程中运行,则可能需要Handler。

  

Handler允许您发送和处理Message和Runnable对象   与线程的MessageQueue相关联。每个Handler实例都是   与单个线程和该线程的消息队列相关联。

当你创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在它们出现时执行它们消息队列。

Handler有两个主要用途:

  

(1)安排消息和runnables作为某些点执行   未来;

  

(2)将要在不同的线程上执行的操作排入队列   你自己的。

您可以阅读有关处理程序及其用法的更多here

对于布尔值和原子布尔值,请阅读thisthis

答案 1 :(得分:0)

不确定您是否阅读了HandlerAtomicBoolean文件。处理程序与线程的消息队列相关联,这是线程安全的。所以你可以通过Handler在线程之间传输数据,而不必担心同步。 AtomicBoolean是布尔值同步的类,而不是基本数据类型。