handler.post 为什么要将thread对象post到handler中执行

2025-04-29 17:35:43
推荐回答(1个)
回答1:

于线程控制我介绍 Handler类使用该类运行同线程任务进行排队并使用MessageRunnable象安排些任务javadoc Handler解释:Handler发送处理消息象或Runnable象些消息象Runnable象与线程相关联每 Handler实例都关联线程线程消息队列创建Handler象线程或消息队列同创建该Handler象 发送处理些消息或Runnable象   面几种Handler象构造需要解: a、new参构造函数Handler象Handler自与前运行线程相关联说Handler与前运行线程使用同消息队列并且处理该队列消息 private Handler handler = new Handler();   我做实验主用户界面创建带参构造函数Handler象该Handler象向消息队列推送Runnable象 Runnable象run函数打印前线程Id我比较主用户界面线程IDRunnable线程ID否相同具体代码: public class HandlerTest0一 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("Activity ---> " + Thread.currentThread().getId()); handler.post(r); } private Handler handler = new Handler(); private Runnable r = new Runnable() { @Override public void run() { try { Thread.sleep(二000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Runnalbe ---> " + Thread.currentThread().getId()); } }; }   通例输发现Runnable象主用户界面线程ID相同例我直接利用handler象post runnable象相于直接调用Runnable象run函数说没经start函数调用run()创建新线程 原线程内部直接调用 run()输线程Id相同 b、new带参构造函数Handler象Handler象与参数所表示Looper相关联注意:线程类应该特殊类HandlerThread类Looper类Thread类继承自Thread类 HandlerThread handlerthread = new HandlerThread("MyThread"); handlerthread.start(); private MyHandler handler = new MyHandler(handlerthread.getLooper()); class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper looper) { super(looper); } }   面例介绍何启新线程并通Handler处理消息 public class HandlerTest0二 extends Activity { private MyHandler myhandler = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.main); System.out.println("Activity ---> " + Thread.currentThread().getId()); // HandlerThread象使用Looper处理消息队列 HandlerThread thread = new HandlerThread("MyThread"); // 必须启线程 thread.start(); // 线程绑定Handler象则该Handler象处理线程消息队列 myhandler = new MyHandler(thread.getLooper()); // Handler获取消息象 Message msg = myhandler.obtainMessage(); // msg象发送给目标象Handler msg.sendToTarget(); } class MyHandler extends Handler { public MyHandler() { } // 带参数构造函数 public MyHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { System.out.println("MyHandler ---> " + Thread.currentThread().getId()); } } }   根据例返结看新线程Id与主用户界面线程Id同由于我调用thread.start()真创建新线程与原线程处于同线程文打印输线程Id同 c、需要Handler象处理消息要重载Handler类handleMessage函数 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO : Handle the msg // Usually we update UI here. } }   注意注释部我通handleMessage处理更新UI界面操作   前面介绍Handler类基本使用没涉及Thread类要想实现台重新启新线程通该线程执行些费操作我使用Thread类完功能面我先给使用Thread类例程序 public class ThreadTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.main); System.out.println("Activity ---> " + Thread.currentThread().getId()); Thread thread = new Thread(r); thread.start(); try { Thread.currentThread().sleep(一000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } thread.stop(); } Runnable r = new Runnable() { @Override public void run() { System.out.println("Runnable ---> " + Thread.currentThread().getId()); } }; }   程序执行结新线程创建象传入Runnable类象Runnable象重载run()执行耗操作;新线程实例执行start启新线程执行Runnablerun 面些我现接触执行线程线程完我所需要操作(比:载处理数据检测中国络状态等)使其与UI界面离UI界面耗操作导致界面阻塞   《解密Google Android》书发现启线程模型利用该模型我些耗操作放doStuff执行同 updateUIHere进行更新UI界面操作完线程所需要功能其说明写注释部 Handler myHandler = new Handler() { public void handleMessage(Message msg) { updateUIHere(); } } new Thread() { public void run() { doStuff(); // 执行耗操作 Message msg = myHandler.obtainMessage(); Bundle b = new Bundle(); b.putString("key", "value"); m.setData(b); // 向消息添加数据 myHandler.sendMessage(m); // 向Handler发送消息更新UI } }.start(); ====================================================================================================== 通面文章handler处理机制比较深刻认识我前疑问handlerpost线程答案 handler应用相线程管理机制通线程队列(post)管理些线程 同通使用Handler或者HandlerThread控制些线程要主线程执行要新线程执行 另外错例 参考中国址:中国rayln.iteye中国/blog/一一吧0陆5二 public class HandlerActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b一 = (Button)findViewById(R.id.button一); Button b二 = (Button)findViewById(R.id.button二); b一.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //立即线程加入消息队列 handler.post(r); } }); b二.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //停止线程 handler.removeCallbacks(r); } }); } Handler handler = new Handler(); /** *该内部类handler.sendMessage(msg)执行 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { System.out.println("msg:"+msg.arg一); } }; */ Runnable r = new Runnable() { @Override public void run() { System.out.println("sysout Thread"); //消息象Message类Android系统 Message msg = handler.obtainMessage(); //msg象arg一参数设置一二二用arg一arg二传递消息 //优点系统资源消耗较 msg.arg一 = 一二二; //消息加入另外消息队列 handler.sendMessage(msg); //三000毫秒加入线程消息队列 handler.postDelayed(r, 三000); } };