Android HandlerThread的使用
2016-08-15 21:29
363 查看
介绍
首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多个任务,所以我们会在应用程序当中创建多个线程。为了让多个线程之间能够方便的通信,我们会使用
Handler实现线程间的通信。
下面我们看看如何在线程当中实例化
Handler。在线程中实例化
Handler我们需要保证线程当中包含
Looper(注意:UI-Thread默认包含Looper)。
为线程创建
Looper的方法如下:在线程run()方法当中先调用Looper.prepare()初始化Looper,然后再run()方法最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。(注意:Looper.loop()方法默认是死循环)
我们实现Looper有没有更加简单的方法呢?当然有,这就是我们的
HandlerThread。我们来看下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.
使用步骤
尽管HandlerThread的文档比较简单,但是它的使用并没有想象的那么easy。创建一个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);
通过以上三步我们就成功创建HandlerThread。通过handler发送消息,就会在子线程中执行。
如果想让HandlerThread退出,则需要调用handlerThread.quit();。
public class MainActivity extends Activity { /** * * 程序说明: * UI Thread 通过handler向其他线程发送数据并进行打印 * */ private Handler superHandler; private Handler normalHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NormalThread normalThread = new NormalThread(); normalThread.start(); HandlerThread handlerThread = new HandlerThread("leochin.com"); handlerThread.start(); /* * 将handlerThread中创建的looper传递给Handler。 * * 也就意味着该Handler收到Message后,程序在HandlerThread创建的线程中运行 * */ superHandler = new Handler(handlerThread.getLooper()){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int what = msg.what; if(what == 2){ Log.d("wenhao",Thread.currentThread().getName()+" HandlerThread is OK"); } } }; } /** * * 普通线程 * */ class NormalThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub Looper.prepare(); normalHandler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int what = msg.what; if(what == 1){ Log.d("wenhao",Thread.currentThread().getName()+ " NormalThread is OK"); } } }; Looper.loop(); } } /** * * 向普通线程发送数据 * * @param view */ public void normalThreadUse(View view){ if(normalHandler == null){ return; } normalHandler.sendEmptyMessage(1); } /** * * 向HandlerThread发送数据 * * @param view */ public void handlerThreadUse(View view){ if(superHandler == null){ return; } superHandler.sendEmptyMessage(2); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
相关文章推荐
- Android 使用Handler实现Thread间通信
- Android 开发中的 Handler ,Thread ,Message ,Runnable 的综合使用方法
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- 在Android中使用Handler和Thread线程
- 【摘录】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android,UI主线程与子线程 handler,thread使用
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- android handler和thread的使用
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- 在Android中使用Handler和Thread线程执行后台操作
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等