Handler 属于包import android.os.Handler一般用于在工作线程(子线程)中去更新UI线程(主线程)的数据,如更新某个View的状态、刷新界面、弹出对话框等。为什么要使用Handler呢?什么时候需要使用工作线程呢?在开发中,一些比较耗时的操作,如大文件读写,数据库操作以及网络下载需要很长时间,如果全部在主线程中处理,会造成界面很卡,而且很容易出现ANR的响应提示窗口,这个时候我们可以考虑创建一个工作线程(继承Thread类或者实现Runnable接口)来解决。但是对于Android平台来说UI线程不是线程安全的,使用工作线程更新UI会出现异常,所以需要引入一些同步的机制来处理,Handler因此就产生了。可以在UI线程中创建一个Handler对象,实现它的handleMessage(Message msg)方法,它与工作线程中间通过Message来传递数据。本文只简单的讲述handler的使用,下一篇将详细讲述Android的消息处理机制。
下面我们通过一个简单的demo来了解hander的实际使用。该demo通过一个子线程更新TextView的值。
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
public
class
MainActivity
extends
Activity {
private
TextView mTextView;
private
Button mButton;
private
static
final
int
UPDATE_TEXTVIEW =
0
;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView)
this
.findViewById(R.id.textview);
mButton = (Button)
this
.findViewById(R.id.button);
mButton.setOnClickListener(
new
OnClickListener() {
public
void
onClick(View v) {
Thread t =
new
Thread(
new
UpdateThread());
t.start();
}
});
}
private
Handler mHandler =
new
Handler(){
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
UPDATE_TEXTVIEW:
mTextView.setText(
"尼玛,敢改我的值~~"
);
break
;
}
}
};
private
class
UpdateThread
implements
Runnable {
public
void
run() {
Message msg = mHandler.obtainMessage();
msg.what = UPDATE_TEXTVIEW;
msg.sendToTarget();
}
}
}
|
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.