首页 > 系统 > Android > 正文

Android开发:Handler的使用(三)

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

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

Android开发:Handler的使用(三)

d、自己创建新的线程,然后在新线程中创建Looper,主线程调用子线程中的发消息方法,将消息发给子线程的消息队列。

[java] view plain copypackage com.dxyh.test;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  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 Handler workHandler = 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.");                    LooperThread testThread = new LooperThread();          testThread.start();                    // 注意,这里需要等待一下,防止出现空指针异常          while (null == workHandler) {          }                    testThread.sendMessageTodoYourWork();      }            class LooperThread extends Thread {          @Override          public void run() {              Looper.prepare();                            workHandler = new Handler() {                  // 现在在每个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");                          Looper.myLooper().quit();                          finish();                          break;                      }                      super.handleMessage(msg);                  }              };                            Looper.loop();          }                    public void sendMessageTodoYourWork() {              Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_START to handler.");              // 启动任务(消息只有标识,立即投递)              workHandler.sendEmptyMessage(TASK_BEGIN);                Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_1 to handler.");              // 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)              Message msg1 = workHandler.obtainMessage(TASK_1);              msg1.obj = "This is task1";              workHandler.sendMessage(msg1);                            Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_2 to handler.");                       // 开启任务2(和上面类似)              Message msg2 = Message.obtain();              msg2.arg1 = 10;              msg2.arg2 = 20;              msg2.what = TASK_2;              workHandler.sendMessage(msg2);                Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_END to handler.");              // 结束任务(空消息体,延时2s投递)              workHandler.sendEmptyMessageDelayed(TASK_END, 2000);          }      }  }  

运行结果:

 

e、主/子线程均有一个消息队列,然后相互传递消息(这种方式是最灵活的,双向传递,也不复杂)

[java] view plain copypackage com.dxyh.test;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  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 final static int TASK_BEGIN_OVER    = 11;      private final static int TASK_1_OVER    = 12;      private final static int TASK_2_OVER    = 13;      private final static int TASK_END_OVER  = 14;            private Handler workHandler = 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.");                    LooperThread testThread = new LooperThread();          testThread.start();                    // 注意,这里需要等待一下,防止出现空指针异常          while (null == workHandler) {          }                    testThread.sendMessageTodoYourWork();      }          Handler mainHandler = new Handler () {          // 在每个case之后,不能做耗时的操作          @Override          public void handleMessage(Message msg) {              switch (msg.what) {              case TASK_BEGIN_OVER:                  Log.i(TAG, "[MH_TID:" +                      Thread.currentThread().getId() + "] TASK_BEGIN_OVER");                  break;                                case TASK_1_OVER:                  Log.i(TAG, "[MH_TID:" +                      Thread.currentThread().getId() + "] TASK_1_OVER");                  break;                                case TASK_2_OVER:                  Log.i(TAG, "[MH_TID:" +                      Thread.currentThread().getId() + "] TASK_2_OVER");                  break;                                case TASK_END_OVER:                  Log.i(TAG, "[MH_TID:" +                      Thread.currentThread().getId() + "] TASK_END_OVER");                  finish();                  break;              }              super.handleMessage(msg);          }      };            class LooperThread extends Thread {          @Override          public void run() {              Looper.prepare();                            workHandler = new Handler() {                  // 现在在每个case之后,你可以做任何耗时的操作了                  @Override                  public void handleMessage(Message msg) {                      switch (msg.what) {                      case TASK_BEGIN:                          Log.i(TAG, "[ZH_TID:" +                             Thread.currentThread().getId() + "] Get TASK_BEGIN");                          // 做完之后报告信息给主线程                          mainHandler.sendEmptyMessage(TASK_BEGIN_OVER);                          break;                                                case TASK_1:                          Log.i(TAG, "[ZH_TID:" +                             Thread.currentThread().getId() + "] Get TASK_1");                          // 做完之后报告信息给主线程                          mainHandler.sendEmptyMessage(TASK_1_OVER);                          break;                                                case TASK_2:                          Log.i(TAG, "[ZH_TID:" +                             Thread.currentThread().getId() + "] Get TASK_2");                          // 做完之后报告信息给主线程                          mainHandler.sendEmptyMessage(TASK_2_OVER);                          break;                                                case TASK_END:                          Log.i(TAG, "[ZH_TID:" +                             Thread.currentThread().getId() + "] Get TASK_END");                          Looper.myLooper().quit();                          // 做完之后报告信息给主线程                          mainHandler.sendEmptyMessage(TASK_END_OVER);                          Looper.myLooper().quit();                          break;                      }                      super.handleMessage(msg);                  }              };                            Looper.loop();          }                    public void sendMessageTodoYourWork() {              Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_START to handler.");              // 启动任务(消息只有标识,立即投递)              workHandler.sendEmptyMessage(TASK_BEGIN);                Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_1 to handler.");              // 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)              Message msg1 = workHandler.obtainMessage(TASK_1);              msg1.obj = "This is task1";              workHandler.sendMessage(msg1);                            Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_2 to handler.");                       // 开启任务2(和上面类似)              Message msg2 = Message.obtain();              msg2.arg1 = 10;              msg2.arg2 = 20;              msg2.what = TASK_2;              workHandler.sendMessage(msg2);                Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +                  "Send TASK_END to handler.");              // 结束任务(空消息体,延时2s投递)              workHandler.sendEmptyMessageDelayed(TASK_END, 2000);          }      }  }  

运行结果:

 

    小结:Handler在Android中是很常用的,或是用来更新UI,或是派发任务给子线程去执行,也可以用来产生超时效果,比如用sendMessageDelayed(TASK_TIMEOUT, OUT_TIME)方法。


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