AsyncTask、Thread 写法

来源:互联网 发布:p2p网络管理 编辑:程序博客网 时间:2024/06/17 14:55

面试总是会被问到handler、message巴拉巴拉的,说起AsyncTask就会问它有哪些方法?分别干什么的。。。
天天用当然知道干嘛的,可每次一写就自动生成了,我这种重在出结果的人真没怎么注意到每一个方法名怎么拼,具体还要说在那个线程运行,,,好吧,都是借口,基础不够扎实。但是并不影响我做项目开发,我知道该干什么怎么用,,,然而面试官并不会搭理你这些的。。。哎,,

记几个线程的写法

第一种 继承Thread

第一种:继承Thread,重写run()方法,郭霖大神的书里说”继承的耦合性有点高 ”,大学背过的知识点忘记了,去查了一下,大致意思就是,耦合性越高模块间的关联就越密切,从而模块独立性越差。用线程就是为了单独分离出来执行些耗时操作,所以一般选择第二种:实现接口形式的。

    class ThreadOne extends Thread {        @Override        public void run() {            //处理逻辑        }    }    //使用    new ThreadOne().start();

第二种 实现Runnable接口

第二种,实现Runnable接口:

    class ThreadTwo implements Runnable{        @Override        public void run() {            //处理逻辑          }    }    //使用    ThreadTwo threadTwo=new ThreadTwo();    new Thread(threadTwo).start();

//常见写法:使用匿名类的方式

        new Thread(new Runnable() {            @Override            public void run() {                //逻辑            }        }).start();

异步消息处理机制

Android提供了一套异步消息处理机制,主要由4个部分组成:Message、Handler、MessageQueue、Looper。
其实平时用的能看到的也就Handler和message,如果只知道这俩说明知道怎么用,不过机制也弄懂才能进阶嘛,所有的技术点都是,不懂原理机制再聪明也做不到融汇贯通的。
这里写图片描述

这是第一行代码2中的一张图:平时使用的时候,都是
先创建一个Handler对象,并重写handleMessage()。
在需要操作UI的时候,创建Message对象,通过Handler发送出去。

具体内部原理看了下其他大神的详细源码分析,懂了些,希望过一段时间,我也能看源码自己找答案了。我现在就不班门弄斧了。简单记:

消息发出后,会被添加到MessageQueue的队列(先进先出)中等待被处理
Looper则会一直尝试从MessageQueue中读取待处理消息(有就读取没有就等待)
最后分发回handlerMwssage()方法中。

注:一个线程只会有一个消息队列(MessageQueue),也只有一个Looper对象来管理消息队列,但一个Looper可以对应对个Handler(处理者)

AsyncTask

Android提供的傻瓜式工具真是害人不浅,能让你啥都不懂就能开发,不过也是因为这一点,自己才能没学明白呢就可以养活自己了。不过现在既然干了这行,不能混,该懂得是一定要弄懂得。
AsyncTask是Android基于上述异步消息处理机制封装的工具,可以十分简单的崇子线程切换到主线程。看下用法;

  • AsyncTask是一个抽象类,只能创建一个子类去继承它。(本来想查一查抽象类的具体含义,结果看到一篇说的不错的文章:http://blog.csdn.net/chenssy/article/details/12858267,路过可以看一下)

这里写图片描述

  • 重写AsyncTask的几个方法完成对任务的定制

这里写图片描述

  • 完整写法
public class AsyncTask_addClientCar extends AsyncTask<String, integer, String> {    Handler hdler;    public AsyncTask_addClientCar(Handler h) {        super();        hdler = h;    }    @Override    protected void onPreExecute() {        super.onPreExecute();    }    @Override    protected String doInBackground(String... params) {        String result = null;        String clientId = params[0];        String licensePlate = params[1];        String licenseZone = params[2];        String isCurrent = params[3];        String Name = params[4];        String VehicleLicenseNo = params[5];        Map<String, String> pm = new HashMap<String, String>();        pm.put("clientId", clientId);        pm.put("licensePlate", licensePlate);        pm.put("licenseZone", licenseZone);        pm.put("isCurrent", isCurrent);        pm.put("carbrandId", Name);        pm.put("VehicleLicenseNo", VehicleLicenseNo);        try {            result = HttpUtils.sendPushRequest(Config.URL_addClientCar, pm);        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return result;    }    @Override    protected void onProgressUpdate(integer... values) {        super.onProgressUpdate(values);    }    @Override    protected void onPostExecute(String result) {        super.onPostExecute(result);        bindBean bean = new JsonParser<bindBean>().parserJsonBean(result, bindBean.class);        hdler.sendMessage(hdler.obtainMessage(1, bean));    }}
  • 调用
new AsyncTask_addClientCar(handler).execute(clientId,licensePlate,licenseZone,"0",name,VehicleLicenseNo);