Android HandlerThread
2015-11-05 19:17
896 查看
文章出处:http://blog.csdn.net/shift_wwx
请转载的朋友标明出处~~
之前 Android 中Handler 中大体说了一下handler的应用过程,为了更好实现异步操作,android 提供了HandlerThread。
/**
* Handy class for starting a new thread that has a looper. The looper can then be
* used to create handler classes. Note that start() must still be called.
*/
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}说白了就是个Thread,但是在这里直接将Looper 给弄好了:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}所以,在新建实例之后,必须要start 才能能应用,不然在getLooper的时候:
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}会认为不是alive,返回null。
所以一般应用过程是这样的:
//创建一个HandlerThread,即创建了一个包含Looper的线程。
HandlerThread handlerThread = new HandlerThread("leochin.com");
handlerThread.start(); //创建HandlerThread后一定要记得start()
//获取HandlerThread的Looper
Looper looper = handlerThread.getLooper();
//创建Handler,通过Looper初始化
Handler handler = new Handler(looper);这个handler 就不在UI线程,这样就可以实现了异步操作,至于发msg 还是 post 就在UI 现在操作就可以了。
弄个例子(copy 于Android TV):
public TvInputBaseSession(Context context, String inputId, int deviceId) {
super(context);
mInputId = inputId;
mDeviceId = deviceId;
mTvInputManager = (TvInputManager)context.getSystemService(Context.TV_INPUT_SERVICE);
mHardware = mTvInputManager.acquireTvInputHardware(deviceId,
mHardwareCallback, mTvInputManager.getTvInputInfo(inputId));
initThread(mInputId);
}
private void initThread(String inputId) {
mHandlerThread = new HandlerThread(inputId);
mHandlerThread.start();
mSessionHandler = new Handler(mHandlerThread.getLooper(), this);
}
private void releaseThread() {
mHandlerThread.quit();
mHandlerThread = null;
mSessionHandler = null;
}
@Override
public boolean handleMessage(Message msg) {
if (DEBUG)
Log.d(TAG, "==== handleMessage ====" + msg.what);
switch (msg.what) {
case DroidLogicTvUtils.SESSION_DO_RELEASE:
doRelease();
break;
default:
break;
}
return false;
}
public void doRelease() {
mHardware.setSurface(null, null);
mTvInputManager.releaseTvInputHardware(mDeviceId, mHardware);
releaseThread();
}
@Override
public void onRelease() {
mSessionHandler.obtainMessage(DroidLogicTvUtils.SESSION_DO_RELEASE).sendToTarget();
}
Android TV 中要求有些操作时间不能过长,例如onRelease,通过这样的操作就成功避免了
请转载的朋友标明出处~~
之前 Android 中Handler 中大体说了一下handler的应用过程,为了更好实现异步操作,android 提供了HandlerThread。
/**
* Handy class for starting a new thread that has a looper. The looper can then be
* used to create handler classes. Note that start() must still be called.
*/
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}说白了就是个Thread,但是在这里直接将Looper 给弄好了:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}所以,在新建实例之后,必须要start 才能能应用,不然在getLooper的时候:
public Looper getLooper() {
if (!isAlive()) {
return null;
}
// If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}会认为不是alive,返回null。
所以一般应用过程是这样的:
//创建一个HandlerThread,即创建了一个包含Looper的线程。
HandlerThread handlerThread = new HandlerThread("leochin.com");
handlerThread.start(); //创建HandlerThread后一定要记得start()
//获取HandlerThread的Looper
Looper looper = handlerThread.getLooper();
//创建Handler,通过Looper初始化
Handler handler = new Handler(looper);这个handler 就不在UI线程,这样就可以实现了异步操作,至于发msg 还是 post 就在UI 现在操作就可以了。
弄个例子(copy 于Android TV):
public TvInputBaseSession(Context context, String inputId, int deviceId) {
super(context);
mInputId = inputId;
mDeviceId = deviceId;
mTvInputManager = (TvInputManager)context.getSystemService(Context.TV_INPUT_SERVICE);
mHardware = mTvInputManager.acquireTvInputHardware(deviceId,
mHardwareCallback, mTvInputManager.getTvInputInfo(inputId));
initThread(mInputId);
}
private void initThread(String inputId) {
mHandlerThread = new HandlerThread(inputId);
mHandlerThread.start();
mSessionHandler = new Handler(mHandlerThread.getLooper(), this);
}
private void releaseThread() {
mHandlerThread.quit();
mHandlerThread = null;
mSessionHandler = null;
}
@Override
public boolean handleMessage(Message msg) {
if (DEBUG)
Log.d(TAG, "==== handleMessage ====" + msg.what);
switch (msg.what) {
case DroidLogicTvUtils.SESSION_DO_RELEASE:
doRelease();
break;
default:
break;
}
return false;
}
public void doRelease() {
mHardware.setSurface(null, null);
mTvInputManager.releaseTvInputHardware(mDeviceId, mHardware);
releaseThread();
}
@Override
public void onRelease() {
mSessionHandler.obtainMessage(DroidLogicTvUtils.SESSION_DO_RELEASE).sendToTarget();
}
Android TV 中要求有些操作时间不能过长,例如onRelease,通过这样的操作就成功避免了
相关文章推荐
- Android ListView 使用及MVC关系概要
- android中if判断引起的crash
- Arcgis Android 常见问题
- android之AsyncTask
- android入门级之资源的使用--图片资源--控件ImageView
- 安卓软件全家桶分析,哪些软件是一伙的
- android中常用的开源项目
- Android Studio 调试过程中快捷查看断点处变量值(Ctrl+Shift+I无效)?
- Android 中TextView内容过长加省略号,点击显示全部内容
- 关于android 图标标准 ,效果图切图标准, 单位标准换算
- android binder机制学习(准备工作)
- 【安卓】Android6.0的String源码被修改
- Activity的生命周期(2)
- 【Android学习笔记】Activity的小弟--Fragment以及异步加载数据的Loader
- Android+Dialog;
- 自定义Viewpager
- 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度
- android入门级之资源的使用--声音资源--控件MediaPlayer
- 33.Android 自动适配字体大小的AutoAdjustSizeEditText
- Android开发实践(一)