您的位置:首页 > 产品设计 > UI/UE

android中子线程更新UI的几种方法

2016-06-30 18:11 597 查看


第一种常用的生成Handler对象的方法

这是在主线程中 mHandler 是成员变量
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//在这里得到数据,并且可以直接更新UI
String data = (String)msg.obj;
updateWeather();  //刷新数据
textView.setText(data);
break;
default:
break;
}
}

};

这是在子线程中
....   onClick(View v){
switch(v.getId()){
case R.id.bt:
new Thread(new Runnable(){
@Override
public void run() {
//耗时操作,
Http......网路请求的操作
//需要数据传递,用下面方法;
Message msg =new Message();
msg.what = 0;
msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;
//完成之后发送消息给Handler
mHandler.sendMessage(msg);
}

}).start();
}
}


第二种方法:用Activity对象的runOnUiThread方法更新

//这是在Activity中:
new Thread() {
public void run() {
//这儿是耗时操作,完成之后更新UI;
http....网路请求
runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI
imageView.setImageBitmap(bitmap);
}
});
}
}.start();

//如果不在Activity中则需要得到上下文来调用
Activity activity = (Activity) imageView.getContext();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {                                imageView.setImageBitmap(bitmap);
}
});
如果Thread定义在别的地方,传递一个activity对象就行!


第三种方法:View.post(Runnable r)的方法

imageView.post(new Runnable(){

@Override
public void run() {
imageView.setImageBitmap(bitmap);
}

});
需要在该方法中传递一个View对象


第四种方法Handler.post(Runnable r)方法

//通过点击按钮事件,执行网路耗时操作,得到的数据显示到UI上
主线程中 Handler handler = new Handler() ;
public void onClick(View v) {
//开启线程
new Thread(new Runnable() {
@Override
public void run() {
String str= null;//这里必须要写上 = null !!初始化
try{
Thread.sleep(3000);//这里写网路请求操作
str = "网路请求得到的数据";//比如json数据
} catch (InterruptedException e) {
e.printStackTrace();
}

// 这里也必须声明为final
final String finalStr = str;
//调用方法Handler.post(r);
handler.post(new Runnable() {
@Override
public void run() {
//在这里将得到的数据更新到UI中
textView.setText(finalStr);                            }
});
}
}).start();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ui 线程