Handler:发送消息、处理消息对象
looper :轮训器 ,每个线程只能有一个Looper,决定了handler发送消息到哪个线程。new handler(Looper looper)
message:消息对象
messagequeen:消息队列
handler 创建:
//自定义 线程 +赋值给 handler Thread t = new Thread(new Runnable() { @Override public void run() { Thread thread = Thread.currentThread(); Looper.prepare(); looper = Looper.myLooper(); Looper.loop();//todo 写在Looper.loop()之后的代码不会被执行,这个函数内部是一个循环 } }); t.start(); mHandler.postDelayed(new Runnable() { @Override public void run() { customThreadhandler= new Handler(looper){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); threadMethod(); } }; } },100);
HandlerThread
本质:handler + Thread
mHandlerThread = new HandlerThread("upLoadRecordServiceHandlerThread"); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); threadMethod(); } };
模拟handler 开线程下载:参考:https://blog.csdn.net/u011240877/article/details/72905631
/**
* Description:
* <br> 继承 HandlerThread 模拟下载线程
*
*/public class DownloadThread extends HandlerThread implements Handler.Callback {
private final String TAG = this.getClass().getSimpleName();
private final String KEY_URL = "url";
public static final int TYPE_START = 1;
public static final int TYPE_FINISHED = 2;private Handler mWorkerHandler;
private Handler mUIHandler;
private List<String> mDownloadUrlList;public DownloadThread(final String name) {
super(name);
}@Override
protected void onLooperPrepared() { //执行初始化任务
super.onLooperPrepared();
mWorkerHandler = new Handler(getLooper(), this); //使用子线程中的 Looper
if (mUIHandler == null) {
throw new IllegalArgumentException("Not set UIHandler!");
}//将接收到的任务消息挨个添加到消息队列中
for (String url : mDownloadUrlList) {
Message message = mWorkerHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString(KEY_URL, url);
message.setData(bundle);
mWorkerHandler.sendMessage(message);
}
}public void setDownloadUrls(String... urls) {
mDownloadUrlList = Arrays.asList(urls);
}public Handler getUIHandler() {
return mUIHandler;
}//注入主线程 Handler
public DownloadThread setUIHandler(final Handler UIHandler) {
mUIHandler = UIHandler;
return this;
}/**
* 子线程中执行任务,完成后发送消息到主线程
*
* @param msg
* @return
*/
@Override
public boolean handleMessage(final Message msg) {
if (msg == null || msg.getData() == null) {
return false;
}String url = (String) msg.getData().get(KEY_URL);
//下载开始,通知主线程
Message startMsg = mUIHandler.obtainMessage(TYPE_START, "\n 开始下载 @" + DateUtils.getCurrentTime() + "\n" + url);
mUIHandler.sendMessage(startMsg);SystemClock.sleep(2000); //模拟下载
//下载完成,通知主线程
Message finishMsg = mUIHandler.obtainMessage(TYPE_FINISHED, "\n 下载完成 @" + DateUtils.getCurrentTime() + "\n" + url);
mUIHandler.sendMessage(finishMsg);return true;
}@Override
public boolean quitSafely() {
mUIHandler = null;
return super.quitSafely();
}
}