面试总是会被问到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);