作为一个新手,原本一个简单的textview的settext方法居然发现更新不了界面,甚至会出错崩溃。
对此很无语,自己很无语。后查找资料才发现,因为使用了线程获取http的数据后再更新主界面。但主界面的线程是分离的,不只能直接由线程更新。菜鸟的我就被这样一个无知的问题给折腾了一天。问题找到了,解决问题有下面三种方式:
第一种:
1
2
3
4
5
6
7
8
|
new
Handler(context.getMainLooper()).post(
new
Runnable() {
@Override
public
void
run() {
// 在这里执行你要想的操作 比如直接在这里更新ui或者调用回调在 在回调中更新ui
}
});
|
context是你传过来的context对象
第二种:
1
2
3
4
5
6
7
8
9
|
// 如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程
// 因为runOnUiThread是Activity中的方法,Context是它的父类,所以要转换成Activity对象才能使用
((Activity) context).runOnUiThread(
new
Runnable() {
@Override
public
void
run() {
// 在这里执行你要想的操作 比如直接在这里更新ui或者调用回调在 在回调中更新ui
}
});
|
第三种是使用Handler的方法,往Handler中发送一个消息,然后当Handler接收到你发送过来的消息,再在Handler执行相应的操作
这是接收消息执行的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private
Handler handler =
new
Handler() {
@Override
public
void
handleMessage(Message msg) {
super
.handleMessage(msg);
switch
(msg.what) {
case
1
:
button1.setText(
"点击安装"
);
down =
1
;
break
;
case
2
:
down =
2
;
button1.setText(
"打开"
);
break
;
}
}
};
|
这是发送消息的代码:
1
2
3
4
|
// 往handler发送一条消息 更改button的text属性
|