之前研究过handler 和 looper 消息队列,不过Android里的handler不是另外开启线程来执行的,还是在主UI线程中,如果想另启线程的话需要用到HandlerThread来实现。在使用HandlerThread的时候需要实现CallBack接口以重写handlerMessage方法,在handlerMessage方法中来处理自己的逻辑。下来给出一个小例子程序。 |
002 |
003 | layout文件很简单,就一个按钮来启动HanlderTread线程 |
004 |
005 | <?xml version= "1.0" encoding= "utf-8" ?> |
006 | <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" |
007 | android:layout_width= "fill_parent" |
008 | android:layout_height= "fill_parent" |
009 | android:orientation= "vertical" > |
010 | |
011 | <TextView |
012 | android:layout_width= "fill_parent" |
013 | android:layout_height= "wrap_content" |
014 | android:text= "@string/hello" /> |
015 | |
016 | <Button |
017 | android:id= "@+id/handlerThreadBtn" |
018 | android:layout_width= "wrap_content" |
019 | android:layout_height= "wrap_content" |
020 | android:text= "startHandlerThread" /> |
021 | |
022 | </LinearLayout> |
023 | Activity代码如下: |
024 |
025 | package com.tayue; |
026 | |
027 | import android.app.Activity; |
028 | import android.os.Bundle; |
029 | import android.os.Handler; |
030 | import android.os.Handler.Callback; |
031 | import android.os.HandlerThread; |
032 | import android.os.Message; |
033 | import android.view.View; |
034 | import android.view.View.OnClickListener; |
035 | import android.widget.Button; |
036 | /** |
037 | * |
038 | * @author xionglei |
039 | * |
040 | */ |
041 | public class TestHandlerActivity extends Activity implements OnClickListener{ |
042 | |
043 | public Button handlerThreadBTN; |
044 | MyHandlerThread handlerThread; |
045 | Handler handler; |
046 | |
047 | /** Called when the activity is first created. */ |
048 | @Override |
049 | public void onCreate(Bundle savedInstanceState) { |
050 | super .onCreate(savedInstanceState); |
051 | //打印UI线程的名称 |
052 | System.out.println( "onCreate CurrentThread = " + Thread.currentThread().getName()); |
053 | |
054 | setContentView(R.layout.main); |
055 | |
056 | handlerThreadBTN = (Button) findViewById(R.id.handlerThreadBtn); |
057 | handlerThreadBTN.setOnClickListener( this ); |
058 | |
059 | handlerThread = new MyHandlerThread( "myHanler" ); |
060 | handlerThread.start(); |
061 | //注意: 这里必须用到handler的这个构造器,因为需要把callback传进去,从而使自己的HandlerThread的handlerMessage来替换掉Handler原生的handlerThread |
062 | handler = new Handler(handlerThread.getLooper(), handlerThread); |
063 | |
064 | |
065 | } |
066 | |
067 | @Override |
068 | public void onClick(View v) { |
069 | //点击按钮后来开启线程 |
070 | handler.sendEmptyMessage( 1 ); |
071 | } |
072 | |
073 | |
074 | private class MyHandlerThread extends HandlerThread implements Callback { |
075 | |
076 | public MyHandlerThread(String name) { |
077 | super (name); |
078 | } |
079 | |
080 | @Override |
081 | public boolean handleMessage(Message msg) { |
082 | //打印线程的名称 |
083 | System.out.println( " handleMessage CurrentThread = " + Thread.currentThread().getName()); |
084 | return true ; |
085 | } |
086 | |
087 | |
088 | } |
089 | |
090 | |
091 | |
092 | |
093 | } |
094 | 点击按钮,打印的日志如下(这里点击了 3 次) |
095 | 07 - 06 09 : 32 : 48.776 : I/System.out( 780 ): onCreate CurrentThread = main |
096 | 07 - 06 09 : 32 : 55.076 : I/System.out( 780 ): handleMessage CurrentThread = myHanler |
097 | 07 - 06 09 : 32 : 58.669 : I/System.out( 780 ): handleMessage CurrentThread = myHanler |
098 | 07 - 06 09 : 33 : 03.476 : I/System.out( 780 ): handleMessage CurrentThread = myHanler |
099 |
100 | HandlerThread就这么简单。 |
101 |
102 | 当然 android自己也有异步线程的handler,就是AsyncTask,这个类就是封装了HandlerThread 和handler来实现异步多线程的操作的。 |