1. 消息机制的引入
1. 现在有的问题:
只有在UIThread中才能直接更新界面
很多长时间处理数据的工作(联网)都需要在workerThread中执行, 完成后立即去更新界面
2). 解决线程间通信的问题: 消息机制
Handler+Message
Handler+Message +Thread----->AsyncTask
2. Message的使用
Message msg = Message.obtain();//可以利用缓存的message
msg = Message.obtain(handler, callback);
msg.what = 2;//标识
msg.arg1 = 3; //保存int类型的数据
msg.arg2 = 4;
msg.obj = 对象; //保存对象类型的数据
msg.sendToTarget(); //发送消息给目标handler
3. Handler的使用
1). 发送消息
a. 即时的
b. 延时
c. 发空消息
d. 发带数据的消息
ac: sendEmptyMessage(what)
ad: sendMessage(message)
bc: sendEmptyMessageDelayed(what, delayTime)
bd: sendMessageDelayed(message, delayTime)
2). 处理消息
//消息的分发处理逻辑(源码)
public void dispatchMessage(Message msg) { //消息分发处理的流程
if (msg.callback != null) {
handleCallback(msg);//1. 调用msg中的监听回调, 如果执行直接结束
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) { //2. 调用Handler中的监听回调, 如果返回true结束了
return;
}
}
handleMessage(msg); //3. 调用Handler回调方法
}
}
//定义处理消息的Handler
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {//如果message中指定了callback就不会调用
Log.e("TAG", " handler callback");
//return false;
return true;
}
}){
public void handleMessage(android.os.Message msg) {//如果handler callback返回true就不会调用
Log.e("TAG", " handler handleMessage()");
}
};
3. 移除消息(未处理的)
handler.removeMessage(what)
4. 消息机制的原理
5. AsyncTask的使用
1). 理解:
封装了Handler+Thread(内部用的是线程池)
简化Handler处理多线程间通信的问题
2). 使用
AsyncTask<Params, Progress, Result>() 创建异步任务对象
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
execute(Params... params) :
启动任务, 开始任务的执行流程
void onPreExecute() :
在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
Result doInBackground(Params... params) :
在workerThread中执行, 完成任务的主要工作,通常需要较长的时间
void onPostExecute(Result result)
在doInBackground()执行完后在UIThread中执行,一般用来更新界面
publishProgress(Progress... values) : 在分线程中, 发布当前进度
void onProgressUpdate(Progress... values) : 在主线程中更新进度
6. AsyncTask的基本原理
7. Json数据格式和解析
1). 格式:
json数组: []
数组中只能放一个一个的value, 它们是有序的
[value1, value2, value3]
json对象: {}
对象中只能放成对(key:value)的数据, 它们是无序的
[key1:value1, key2:value2, key3:value3]
key的数据类型:
字符串
value的数据类型:
基本类型: int/float/boolean/...
字符串
null
[]
{}
2). 解析
使用Gson框架解析
1>. 特点:
字符串转对象时自动化, 不需要手动解析, 但前提是类的属性名要与{}中的Key一致
效率比较高, 解析快
2. 将java对象转换为json格式的字符串(服务器执行)
String json = new Gson().toJson(object);
3. 将json格式的字符串转换为java对象(客户端执行)
T t = new Gson().fromJson(json, new TypeToken<T>(){}.getType()); //T可能是List/Map/其它对象
8. 图片的三级缓存技术
1). 什么是三级缓存?
一级: 内存中的缓存图片对象, 用Map<url, Bitmap>
二级: 手机sd卡的files或手机内部的files中缓存图片文件
三级: 服务器端保存图片文件
2). 如何应用三级缓存?
例如:
如何根据url根据图片显示?
1). 根据url从一级缓存(Map<url, Bitmap>)中取图片对象, 如果取到了, 直接显示
2). 如果没有, 根据url中包含图片名称(文件名), 手机的sd卡或内部找对就图片文件加载成bitmap
如果找到了, 显示并保存到一级缓存
3). 如果没有, 显示一个默认的图片, 根据url联网请求获取bitmap
如果没有, 显示一张代表错误的图片
如果有:
1). 保存到一级缓存
2). 保存到二级缓存
3). 显示图片