Android是基于Java的,所以也分主线程,子线程!
主线程:实现业务逻辑、 UI绘制更新、各子线程串连,类似于将军;
子线程: 完成耗时(联网取数据、SD卡数据加载、后台长时间运行)操作,类似于小兵;
一、子线程向主线程发消息(Thread+handler):
1、主线程中定义Handler:
主线程:实现业务逻辑、 UI绘制更新、各子线程串连,类似于将军;
子线程: 完成耗时(联网取数据、SD卡数据加载、后台长时间运行)操作,类似于小兵;
一、子线程向主线程发消息(Thread+handler):
1、主线程中定义Handler:
1.Handler mHandler = new Handler(){
2.
3. @Override
4. public void handleMessage(Message msg) {
5. super.handleMessage(msg);
6. switch (msg.what) {
7. case 0:
8. //do something,refresh UI;
9. break;
10. default:
11. break;
12. }
13. }
14.
15.};
2、子线程处理完耗时操作之后发消息给主线程,更新UI:
2.
3. @Override
4. public void handleMessage(Message msg) {
5. super.handleMessage(msg);
6. switch (msg.what) {
7. case 0:
8. //do something,refresh UI;
9. break;
10. default:
11. break;
12. }
13. }
14.
15.};
2、子线程处理完耗时操作之后发消息给主线程,更新UI:
1.mHandler.sendEmptyMessage(0);
这样在子线程与主线程任务分工的条件下完成了消息交互;
这样在子线程与主线程任务分工的条件下完成了消息交互;
二、主线程向子线程发送消息(Thread+handler):
主线程碰到耗时操作要子线程完成,此时发通知给子线程,操作步骤如下:
1、子线程中定义Handler,Handler定义在哪个线程中,就跟那个线程绑定,在线程中绑定Handler需要调用Looper.prepare();方法,主线程中不调用是因为主线程默认帮你调用了;
1.public class LoopThread implements Runnable {
2.
3. public Handler mHandler = null;
4.
5. @Override
6. public void run() {
7. Looper.prepare();
8. mHandler = new Handler() {
9. public void handleMessage(Message msg) {
10. String result = NetUtil.getJsonContent("北京");
11. //完成了获取北京天气的操作;
12. Log.i("test", "handler"+result);
13. }
14. };
15. Looper.loop();
16. }
17.
18.}
2.
3. public Handler mHandler = null;
4.
5. @Override
6. public void run() {
7. Looper.prepare();
8. mHandler = new Handler() {
9. public void handleMessage(Message msg) {
10. String result = NetUtil.getJsonContent("北京");
11. //完成了获取北京天气的操作;
12. Log.i("test", "handler"+result);
13. }
14. };
15. Looper.loop();
16. }
17.
18.}
其中Looper.prepare();和Looper.loop();维护了一个消息队列,等待消息注入并在子线程中执行;
2、主线程中这样调用:
2、主线程中这样调用:
1.Thread.mHandler.sendEmptyMessage(0);
主线程向子线程发消息,让子线程执行指定的操作,在Android中还有一种方法,即:HandlerThread,看下面的例子:
1.HandlerThread handlerThread = new HandlerThread("jerome");
2.handlerThread.start();
3.
4./**
5. * 这里要将HandlerThread创建的looper传递给threadHandler,即完成绑定;
6. */
7.threadHandler = new Handler(handlerThread.getLooper()) {
8.
9. @Override
10. public void handleMessage(Message msg) {
11. super.handleMessage(msg);
12. switch (msg.what) {
13. case 0:
14.这儿可以做耗时的操作;
15. Log.i("jerome", "hello,I am sub thread");
16. break;
17. default:
18. break;
19. }
20. }
21.};
三,android中handler.post();和view.post();?
android中handler.post();和view.post();方法可以用来刷新ui线程我看了下源码,发现view.post()方法内会创建一个handler,并调用handler.post()用view.post在代码编写上会省事,不用自己去new handler
Android的线程分UI线程与非UI线程两类。
而Handler是非UI线程向UI线程传递消息的桥梁。除了非常常用sendMessage之外,Handler也提供了post(Runnable...),postDelayed等
风骚犀利的方法,利于我们使用“闭包式编程”。
风骚犀利的方法,利于我们使用“闭包式编程”。
View作为UI的一部分,也无例外的提供了一个淫荡的View.post(Runnable)方法,让我们在UI线程中doSomeThing。灵活使用View.post。神马Handler,Activity.runOnUIThread,
都可以一边站去。
都可以一边站去。
相同
在与UI线程的通信上,Handler与View,其实最终都做了同样的事情。就是将消息传递在UI线程的消息队列里,执行一些处理操作。
在与UI线程的通信上,Handler与View,其实最终都做了同样的事情。就是将消息传递在UI线程的消息队列里,执行一些处理操作。
new handler 与 view.post()的区别是 ?
前面是你自己创建、后面是view的内部帮你完成
handler和AsyncTask分别在哪种情况下用?用哪个好?
AsyncTask 分前台任务和后台任务, 后台任务是通过线程池实现的。它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
前面是你自己创建、后面是view的内部帮你完成
handler和AsyncTask分别在哪种情况下用?用哪个好?
AsyncTask 分前台任务和后台任务, 后台任务是通过线程池实现的。它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
handler 处理方式很单一, 就是个消息处理. 处理线程是调用loop()方法。使用handler会代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。
handle是主线程 ,Thread是从线程。控件数据更改只能在主线程 里,所以要用handle.更新UI只能在主线程里进行,否则会报错。但有时我们在子线程里进行操作需要更新UI,handler就登场了,它可以把子线程的数据传给主线程,让主线程同步操作来更新UI。