Hander , HandlerThread 用法
- package com.example.handlerdemo2;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ProgressBar;
- public class MainActivity extends Activity {
- private Button startButton = null;
- private ProgressBar progressBar = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- startButton = (Button)findViewById(R.id.start_button);
- progressBar = (ProgressBar)findViewById(R.id.progress_bar);
- startButton.setOnClickListener(new StartButtonListener());
- }
- @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;
- }
- class StartButtonListener implements OnClickListener
- {
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- // Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.
- // 这里把线程加入消息队列, 这里离线程是主线程,
- handler.post(updateThread);
- }
- }
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- System.out.println("handleMessage");
- if(msg.arg1 > 100)
- {
- handler.removeCallbacks(updateThread);
- }
- else
- {
- progressBar.setProgress(msg.arg1);
- handler.post(updateThread);
- }
- }
- };
- Runnable updateThread = new Runnable(){
- int i = 0;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- System.out.println("Begin thread");
- i += 10;
- Message msg = handler.obtainMessage();
- msg.arg1 = i;
- try{
- Thread.sleep(1000);
- }catch(InterruptedException ex){
- ex.printStackTrace();
- }
- //Pushes a message onto the end of the message queue after all pending messages before the current time.
- //It will be received in handleMessage(Message), in the thread attached to this handler.
- handler.sendMessage(msg);
- //视频是在这里做半段, 在这里做判断会导致死循环,因为 removeCallbacks 把线程移出消息队列,并没有删除,
- //而 当调用sendMessage(msg) 后会调用 handlerMessage()这个方法,又把线程加入消息队列
- // if(i >= 100)
- // {
- // System.out.println("removeCallbacks");
- // handler.removeCallbacks(updateThread);
- // }
- }
- };
- }
下面是 HandlerThread ,开辟新线程
- package com.example.handlerthreaddemo2;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.Looper;
- import android.os.Message;
- import android.view.Menu;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //生成 HandlerThread对象
- HandlerThread handlerThread = new HandlerThread("handler_thread");
- // 在 调用handlerThread.getLooper() 之前一定要 start() ,否则调用getLooper()取得空
- handlerThread.start();
- MyHandler handler = new MyHandler(handlerThread.getLooper());
- Message msg = handler.obtainMessage();
- //Bundle 用来传递数据, 可以简单看成特别的map , key 只能是String ,
- Bundle data = new Bundle();
- data.putInt("age", 11);
- data.putString("name", "zhangsan");
- msg.setData(data);
- msg.sendToTarget();
- }
- @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;
- }
- class MyHandler extends Handler{
- public MyHandler()
- {
- }
- public MyHandler(Looper looper)
- {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Bundle bundle = msg.getData();
- System.out.println("name:" + bundle.get("name") + "age:" + bundle.get("age"));
- System.out.println("myHandler" + Thread.currentThread().getId());
- //这里打印 名字 是 handler_thread 开始构造函数输入的名称
- System.out.println("myHandler" + Thread.currentThread().getName());
- }
- }
- }