第一种常用的生成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();
}