0基础安卓,为了记录。
1.安卓为什么要执行子线程,什么情况下用子线程?
答:将消耗时间的任务放到子线程中执行,保证主线程UI的流畅性。
2.具体实现
当需要请求网络数据的时候,会把请求过程放在子线程里,主线程调用的时候直接是checkBag(参数)。
比如我需要类似于web的ajax验证
public void checkBag(final String bagCode){
//取出后端的数据
Thread thread = new Thread("Thread1") {
HttpURLConnection connection = null;
BufferedReader reader = null;
public void run() {
String url = Tools.getPropertiesURL(CaptureActivity.this,"url.prop","urlCheck");
//show(url);
try {
String responseSend = HttpCheck.checkBag(bagCode,url);
//消息机制
Bundle bundle = new Bundle();
bundle.putString("result",responseSend);
bundle.putString("bagCode",bagCode);
Message msg = new Message();
msg.setData(bundle);
myhandler.sendMessage(msg);
msg.what = 0;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
};
};
thread.start();
}
用message或者buddle进行和主线程通信,
主线程有一个handler,handler包含线程队列和消息队列,实现异步消息处理机制。
主要作用有:1.运行在某个线程上,共享线程的消息队列。2.接收消息、调度消息、派发消息和处理消息。3.实现消息的异步处理。
简单理解为:一个连接主线程和子线程的工具。
上面的代码中有
myhandler.sendMessage(msg);
msg.what = 0;
这是讲请求返回的数据发送到主线程,并添加一个标识 what,这个what很重要,用来区分哪个线程发送的数据。子线程发送数据后需要主线程来接受,在哪接受呢?就是handler,hander的代码:
private static class MyHandler extends Handler {
private final WeakReference<CaptureActivity> mActivity;
public MyHandler(CaptureActivity activity) {
mActivity = new WeakReference<CaptureActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = new Bundle();
bundle = msg.getData();
if (mActivity.get() == null) {
return;
}
mActivity.get().updateUIThread(msg);
}
}
updateUIThread(msg);
handler是一个中转的过程,需要将msg传到更新主线程的方法中,上面updateUIThread(msg)就是起这么个作用。
updateUIThread代码是:
private void updateUIThread(Message msg){
switch (msg.what){
case 0:
//what标识为0的线程执行操作,填充数据,跳转等
break;
case 1:
//what标识为1的线程执行操作
break;
default:
//默认的情况
break;
}
}
所以就实现了线程和主线程直接的通信