我在网上找到了这个代码。我是一个新手,所以我不太了解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);
}
}
答案 0 :(得分:1)
如果您希望代码在UI线程中运行,则可能需要Handler。
Handler允许您发送和处理Message和Runnable对象 与线程的MessageQueue相关联。每个Handler实例都是 与单个线程和该线程的消息队列相关联。
当你创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在它们出现时执行它们消息队列。
Handler有两个主要用途:
(1)安排消息和runnables作为某些点执行 未来;
和
(2)将要在不同的线程上执行的操作排入队列 你自己的。
您可以阅读有关处理程序及其用法的更多here。
答案 1 :(得分:0)
不确定您是否阅读了Handler和AtomicBoolean文件。处理程序与线程的消息队列相关联,这是线程安全的。所以你可以通过Handler在线程之间传输数据,而不必担心同步。 AtomicBoolean是布尔值同步的类,而不是基本数据类型。