Handler消息处理机制(一)
消息处理思想流程:
如获得了服务器的数据,要让界面改变显示数据
但是 要改变界面必须得在主线程中完成,而主线程不能实现耗时操作(网络请求是耗时操作)
所以 要在子线程中完成网络请求 再把消息传给主线程 让主线程去更改界面
消息处理方法流程:
在主线程创建Handler对象 并重写handelMessage()方法
创建子线程,在子线程中调用sentMessage()方法,该消息会存于MessageQueue消息队列中, 通过Looper对象取出MessageQueue中的一条消息,再给回Handler去调用handlerMessage()
消息处理具体方法使用:
1 在主线程创建Handler对象,重写handlerMessage方法
HandlerMessage会根据子线程发送消息而再去调用
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: {
// 主线程收到子线程传来的消息调用此方法 进行UI更新
Log.i("dialogNumbers", String.valueOf(dialogNumbers));
questionBody.setText(getAQData.questionArray.get(dialogNumbers));
setProgress();
break;
}
}
}
};
2 创建子线程:(在需要通知主线程的地方 进行消息的发送
Handler.sentEmptyMessage(0) 0是标识 让主线程根据不同的标识进行不同的操作)
private void setProgress() {
new Thread(new Runnable() {
@Override
public void run() {
currentprogress = 0; // 设置初始值为0
while (currentprogress <= progressBar.getMax()) { //设置循环5次
if (currentprogress == 0) {
currentprogress++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
progressBar.setProgress(currentprogress);
currentprogress++;//设置每1S进度加1
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 进度完成时跳转下一页
dialogNumbers++;
// 重置进度
progressBar.setProgress(0);
// 发送消息给主线程 通知它去更新UI 这里的0为标识 可以让主线程根据不同的标识进行不同的操作
handler.sendEmptyMessage(0);
}
}).start();
}
要传值:
Message message=new Message();
Bundle bundle=new Bundle();
bundle.putString("values",values);
message.setData(bundle);
myHandler.sendMessage(message);//发送message信息
message.what=3;
String xiabiaoString= msg.getData().getString("values");
问题:
会有内存泄漏的可能?