0

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

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);
    }

}
4

2 回答 2

1

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

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

当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列——从那时起,它会将消息和可运行对象传递到该消息队列并在它们从消息中出来时执行它们队列。

Handler有两个主要用途:

(1) 安排消息和可运行文件作为未来某个时间点执行;

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

您可以在此处阅读有关处理程序及其用法的更多信息。

对于 boolean 和 atomic boolean 阅读thisthis

于 2013-11-07T06:44:16.653 回答
0

不确定您是否阅读过HandlerAtomicBoolean文档。Handler 与线程的消息队列相关联,是线程安全的。这样就可以通过Handler在线程间传递数据,不用担心同步问题。AtomicBoolean 是用于布尔值同步的类,而不是原始数据类型。

于 2013-11-07T09:09:36.600 回答