关闭

Android09--Android之Handler机制

标签: android
157人阅读 评论(0) 收藏 举报
分类:

1.Android中的异步任务Handler

Handler:Android提供的处理UI界面更新的一套异步机制..可以发送消息和接受消息.
Handler机制涉及到四个类:Message MessageQueue Looper Handler
以生产者消费的模型来说:

Message:产品
MessageQueue: 仓库
Looper: 循环查看仓库是否有消息
Handler:物流(将产品放进仓库—>处理每一个包裹)

注意
1.只有主线程默认有Looper,没个线程仅有一个looper.并且looper是个死循环,在循环里会监视MessageQueue中的消息,如果有就回调Handler中的dispatchMessage去处理消息.

2.具体的使用

Message:(包装成一个消息)
构造方法:

                    // 不推荐
                Message message1 = new Message();
                    // 消息是存在线程池中的,先看线程池中是否有可重用的消息,重复使用,节省资源
                    Message message = Message.obtain();
                    message.arg1 = i + 1;
                    message.what = 0;
                    // 将消息发给主线程(原则:主线程执行的操作越少越好)
                    handler.sendMessage(message);

从网上获取网页内容:

// 布局是一个WebView

public class NetWorkHandler implements Runnable, Handler.Callback {
    private String url;
    private callBack call;
    private Handler handler;

    public NetWorkHandler(String url, callBack call) {
        this.url = url;
        this.call = call;
        // 指明是主线程中,handler和主线程中的looper绑定
        handler = new Handler(Looper.getMainLooper(), this);
    }


    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case 0:
                call.onSuccess(((String) msg.obj));
                break;
            case 1:
                call.onFail(((Exception) msg.getData().getSerializable("Exception")), msg.getData().getString("text"));
                break;
            case 2:
                call.onFail(((Exception) msg.getData().getSerializable("Exception")), msg.getData().getString("text"));
                break;
        }
        return true;
    }

    @Override
    public void run() {
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
            connection.setRequestMethod("GET");
            connection.setDoInput(true);
            int code = connection.getResponseCode();
            if (code == 200) {
                InputStream is = connection.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int length;
                byte[] buffer = new byte[102400];
                while ((length = (is.read(buffer))) != -1) {
                    baos.write(buffer, 0, length);
                }
                String text = baos.toString("UTF-8");
                handler.obtainMessage(0, text).sendToTarget();
            } else {
                RuntimeException e = new RuntimeException("ResponseCode:" + code);
                String text = new String("网络错误");
                Bundle bundle = new Bundle();
                bundle.putString("text", text);
                bundle.putSerializable("Exception", e);
                Message obtain = Message.obtain(handler, 1);
                obtain.setData(bundle);
                obtain.sendToTarget();
            }
        } catch (IOException e) {
            String text = new String("IO异常");
            Bundle bundle = new Bundle();
            bundle.putString("text", text);
            bundle.putSerializable("Exception", e);
            Message obtain = Message.obtain(handler, 1);
            obtain.setData(bundle);
            obtain.sendToTarget();
        }
    }

    public interface callBack {
        void onSuccess(String text);

        void onFail(Exception e, String text);
    }
}

测试类:

private String url = "http://www.imooc.com/learn/135";
    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        webView = (WebView) findViewById(R.id.main2_web);
        new Thread(new NetWorkHandler(url,this)).start();
    }

    @Override
    public void onSuccess(String text) {
        webView.loadDataWithBaseURL("http://www.imooc.com/",text,"text/html; charest=UTF-8","UTF-8",null);
    }
    @Override
    public void onFail(Exception e, String text) {
        e.printStackTrace();
        Toast.makeText(Main2Activity.this, text,  Toast.LENGTH_SHORT).show();
    }
}

3.Handler和AsyncTask的联系区别

1.首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
2.Handler机制:我们通过Message包装一个消息,通过Handler发送到消息仓库(掌管仓库的是MessageQueue);并且Looper在不时的盯着仓库,是否有消息,如果有就去出来交给Handler再去处理.
3.AsyncTask:AsyncTask异步任务是通过onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法;这几个方法.doInBackground()函数在后台执行数据的处理,然后自动调用onProgressUpdate等方法来更新UI界面.

参考文献:
https://changer0.github.io/2016/08/30/Android%E7%AC%94%E8%AE%B0/Day25-Handler%E5%92%8CApplication/

0
0
查看评论

有关Handler机制原理的总结

Handler是线程与线程间进行通信的一套机制。        Handler是常被开发者拿来更新UI的一种消息处理机制,它的运行机制需要底层的Looper和MessageQueue的支撑。    ...
  • duanmulirui
  • duanmulirui
  • 2017-03-31 15:30
  • 875

深入理解Android中的Handler机制

Handler机制在Android多线程编程中可以说是不可或缺的角色,也是必须掌握的内容,所以深入掌握并应用Handler异步处理机制在Android开发中显得特别重要。它在使用的过程中主要与Messgae、MessageQueue、和Looper这三者一起使用,实现Android的异步消息处理机制...
  • reakingf
  • reakingf
  • 2016-07-28 13:51
  • 8079

Handler机制的理解与使用

Handler机制的使用,子线程中使用Handler和HandlerThread的使用
  • llayjun
  • llayjun
  • 2016-04-18 11:28
  • 2125

面试题:阐述Handler的实现原理

处理过程: 从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send…方法把消息push到MessageQueue队列中。 Looper对象会轮询MessageQueue队列,把消息对象取出。 通过dispatchMessage分发给Handler,再回调用Ha...
  • blackzhangwei
  • blackzhangwei
  • 2016-07-18 21:01
  • 5141

Handler机制原理

在Android中谈到Handler,我们首先来讲一下Handler的机制和原理      1、Handler机制原理           Handle...
  • francisshi
  • francisshi
  • 2014-08-14 01:51
  • 1510

Android中的Handler的机制与用法详解

目录结构 Android中的Handler的机制与用法详解,什么是Handler,如何传递 Message,传递 Runnable 对象,传递 Callback 对象,Handler 原理是什么?Handler 与 Looper、MessageQueue 的关系,HandlerThread是什...
  • wangning13ji
  • wangning13ji
  • 2016-08-23 11:43
  • 1446

Android Handler机制图解以及在实际中的运用

大家在Android开发中不免会遇到主线程跟新UI,线程切换的场景,其中Handler就是一名大将了有必要对他进行了解。一、图解Handler的基本概念什么是Handler呢,Handler是Android给我们提供来跟新UI的一套机制,也是一套消息处理的机制,可发送也可通过他来处理消息,我们看下图...
  • Tomasyb
  • Tomasyb
  • 2017-06-06 09:41
  • 322

handler消息机制源码解析

1, 基本概念 Handler主要做什么?机制是怎样的?有其他相同或者类似的机制吗? 我们知道,Binder主要用于跨进程通信,Handler呢?主要用于进程内部进行通信,或者说进程内部不同线程之间进行通信,即是不同线程之间互相发送消息。   额外知识: libcore/libart/sr...
  • u012439416
  • u012439416
  • 2016-09-14 21:48
  • 825

全面分析Handler消息机制

相信Handler大家都很熟悉了,最常见的用法就是在一个线程用Handler对象sendMessage,然后在UI线程该Handler对象执行handleMessage使用Message中的数据去更新UI。 Handler的最主要作用确实如此,但是作为Android系统一个很重要的组件如果对它的认识...
  • sinat_23092639
  • sinat_23092639
  • 2016-08-28 17:14
  • 1081

Handler机制用法概述

大前提:UI线程模型:A:不能在UI线程中做耗时操作,即不要阻塞UI线程超过5秒,否则有出现ANR(Application not responsing)错误的危险.B:不能在非UI线程中直接更新UI一、Handler消息传递机制初步认识:(一)、引入:子线程没有办法对UI界面上的内容进行操作,如果...
  • iblade
  • iblade
  • 2016-02-19 20:19
  • 740
    个人资料
    • 访问:25753次
    • 积分:990
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:17篇
    • 译文:0篇
    • 评论:2条
    文章分类