线程通信

来源:互联网 发布:淘宝手机页面设为首页 编辑:程序博客网 时间:2024/05/17 22:32

Handler

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

1个Looper,1个MessageQueue,绑定一个Looper的多个Handler

实例化Handler

当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据

            final Handler handler = new Handler(getMainLooper()) {                @Override                public void handleMessage(Message msg) {                    // 处理消息                }            };

子线程中引用Handler

Handler有两个作用:
(1) 分发Message对象和Runnalbe 对象 到主线程
(2) 让一个动作,在不同的线程中执行。

//Handler中分发消息的一些方法// post(Runnable) -----------立即执行// postAtTime(Runnable,long) -----------在某一时刻执行// postDelayed(Runnable,long) ----------推迟执行// sendEmptyMessage(int) // sendMessage(Message); // sendMessageAtTime(Message,long) // sendMessageDelayed(Message,long) 

Looper子线程写法

1. 升级子线程为Looper子线程        Looper.prepare();2. 开始循环处理消息队列,loop之后的代码不会执行        Looper.loop();

Meassge 消息类

int arg1,arg2       用来存放整型数据Object obj          用来存放发送给接收器的Object类型的任意对象Message replayTo    用来指定此Message发送到何处的可选Message对象int what            用于指定用户的自定义的消息代码,这样接受者可以了解这个信息//不要使用构造方法,会造成内存消耗过大    Message msg = new Message();//从Handler取一个用完的Message             Message msg = handler.obtainMessage();

线程池

有效管理多个子线程,不重复new Thread,防止OOM

    //AsyncTask        1. 实例化AsyncTask对象        MyAsyncTask asyncTask = new MyAsyncTask();        2. 调用顺序        protected void onPreExecute()   //开始执行后台任务之前的准备        protected List<String> doInBackground(String... params)------> publishProgress(i)之后,porogressUpdate方法就被激活        protected void onProgressUpdate(Integer... values)        protected void onPostExecute(List<String> list) //任务完成之后,返回结果的方法        protected void onCancelled()    //手动取消任务的时候        3. 开始执行请求        asyncTask.execute("a", "b", "c", "d", "e", "f", "g");
原创粉丝点击