首页 > 系统 > Android > 正文

Android开发:Handler的使用(二)

2019-11-08 02:52:54
字体:
来源:转载
供稿:网友

http://blog.csdn.net/dengxiayehu/article/details/6400981

Android开发:Handler的使用(二)

2、sendMessage版本的Handler的使用

 

     这里介绍几种模型:

 

a、默认的Handler(消息处理队列挂在主线程上)

[java] view plain copypackage com.dxyh.test;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message;  import android.util.Log;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;    public class MainActivity extends Activity                    implements OnClickListener {      PRivate final static String TAG = "HandlerTest";            private final static int TASK_BEGIN = 1;      private final static int TASK_1 = 2;      private final static int TASK_2 = 3;      private final static int TASK_END   = 4;            private Button btnStart = null;      private Button btnStop = null;            /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);                    btnStart = (Button) findViewById(R.id.btn_start);          btnStart.setOnClickListener(this);          btnStop = (Button) findViewById(R.id.btn_stop);          btnStop.setOnClickListener(this);                    Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]");      }            Handler mHandler = new Handler() {          // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框          @Override          public void handleMessage(Message msg) {              switch (msg.what) {              case TASK_BEGIN:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_BEGIN");                  break;                                case TASK_1:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_1");                  break;                                case TASK_2:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_2");                  break;                                case TASK_END:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_END");                  finish();                  break;              }              super.handleMessage(msg);          }      };            public void onClick(View view) {          switch (view.getId()) {          case R.id.btn_start:              // 启动任务(消息只有标识,立即投递)              mHandler.sendEmptyMessage(TASK_BEGIN);              Log.i(TAG, "Send TASK_BEGIN to handler.");                            // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)              Message msg1 = mHandler.obtainMessage(TASK_1);              msg1.obj = "This is task1";              mHandler.sendMessage(msg1);              Log.i(TAG, "Send TASK_1 to handler.");                            // 开启任务2(和上面类似)              Message msg2 = Message.obtain();              msg2.arg1 = 10;              msg2.arg2 = 20;              msg2.what = TASK_2;              mHandler.sendMessage(msg2);              Log.i(TAG, "Send TASK_2 to handler.");              break;                        case R.id.btn_stop:              // 结束任务(空消息体,延时2s投递)              mHandler.sendEmptyMessageDelayed(TASK_END, 2000);              Log.i(TAG, "Send TASK_END to handler.");              break;          }  }  }  

运行结果:

 

b、消息队列仍绑定在主线程上,但在子线程中发送消息。

[java] view plain copypackage com.dxyh.test;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message;  import android.util.Log;    public class MainActivity extends Activity {      private final static String TAG = "HandlerTest";            private final static int TASK_BEGIN = 1;      private final static int TASK_1 = 2;      private final static int TASK_2 = 3;      private final static int TASK_END   = 4;            /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);                    Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +                  "This is in main thread.");                    workThread.start();      }            Handler mHandler = new Handler() {          // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框          @Override          public void handleMessage(Message msg) {              switch (msg.what) {              case TASK_BEGIN:                  Log.i(TAG, "[H_TID:" +                  Thread.currentThread().getId() + "] Get TASK_BEGIN");                  break;                                case TASK_1:                  Log.i(TAG, "[H_TID:" +                  Thread.currentThread().getId() + "] Get TASK_1");                  break;                                case TASK_2:                  Log.i(TAG, "[H_TID:" +                  Thread.currentThread().getId() + "] Get TASK_2");                  break;                                case TASK_END:                  Log.i(TAG, "[H_TID:" +                  Thread.currentThread().getId() + "] Get TASK_END");                  finish();                  break;              }              super.handleMessage(msg);          }      };            Thread workThread = new Thread() {          // 你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中          @Override          public void run() {              // 启动任务(消息只有标识,立即投递)              mHandler.sendEmptyMessage(TASK_BEGIN);              Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +                      "Send TASK_START to handler.");                            // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)              Message msg1 = mHandler.obtainMessage(TASK_1);              msg1.obj = "This is task1";              mHandler.sendMessage(msg1);              Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +                      "Send TASK_1 to handler.");                            // 开启任务2(和上面类似)              Message msg2 = Message.obtain();              msg2.arg1 = 10;              msg2.arg2 = 20;              msg2.what = TASK_2;              mHandler.sendMessage(msg2);              Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +                      "Send TASK_2 to handler.");                            // 结束任务(空消息体,延时2s投递)              mHandler.sendEmptyMessageDelayed(TASK_END, 2000);              Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +                      "Send TASK_END to handler.");          }      };  }  

运行结果:

c、将消息队列绑定到子线程上,主线程只管通过Handler往子线程的消息队列中投递消息即可。

[java] view plain copypackage com.dxyh.test;    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.util.Log;    public class MainActivity extends Activity {      private final static String TAG = "HandlerTest";            private final static int TASK_BEGIN = 1;      private final static int TASK_1 = 2;      private final static int TASK_2 = 3;      private final static int TASK_END   = 4;            private MyHandler mHandler = null;            /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);            Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +                  "This is in main thread.");                    HandlerThread myLooperThread = new HandlerThread("my looper thread");          myLooperThread.start();                    Looper looper = myLooperThread.getLooper();          mHandler = new MyHandler(looper);                    // 启动任务(消息只有标识,立即投递)          mHandler.sendEmptyMessage(TASK_BEGIN);          Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_START to handler.");                    // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)          Message msg1 = mHandler.obtainMessage(TASK_1);          msg1.obj = "This is task1";          mHandler.sendMessage(msg1);          Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_1 to handler.");                    // 开启任务2(和上面类似)          Message msg2 = Message.obtain();          msg2.arg1 = 10;          msg2.arg2 = 20;          msg2.what = TASK_2;          mHandler.sendMessage(msg2);          Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_2 to handler.");                    // 结束任务(空消息体,延时2s投递)          mHandler.sendEmptyMessageDelayed(TASK_END, 2000);          Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_END to handler.");      }            class MyHandler extends Handler {          public MyHandler(Looper looper) {              super(looper);          }                    // 现在在每个case之后,你可以做任何耗时的操作了          @Override          public void handleMessage(Message msg) {              switch (msg.what) {              case TASK_BEGIN:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_BEGIN");                  break;                                case TASK_1:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_1");                  break;                                case TASK_2:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_2");                  break;                                case TASK_END:                  Log.i(TAG, "[H_TID:" +                      Thread.currentThread().getId() + "] Get TASK_END");                  finish();                  break;              }              super.handleMessage(msg);          }      }  }  

运行结果:

 

[待续]


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表