Android攻城狮 Handler与子线程
生活随笔
收集整理的這篇文章主要介紹了
Android攻城狮 Handler与子线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Handler和線程是相關聯的。再次強調:不可以在主線程中做耗時操作,就比如示例里面主線程中的 handlerMessage(),不能執行耗時操作。
創建一個與自定義線程相關的Handler的代碼: class MyThread extends Thread{public Handler handler;@Overridepublic void run() {Looper.prepare(); // 創建Looper,默認情況是根據當前線程去拿到Looperhandler = new Handler(){ // 與子線程相關的Handler@Overridepublic void handleMessage(Message msg) {System.out.printf("currentThread:"+Thread.currentThread()); // 打印當前線程的id}};Looper.loop(); // 調用該方法實現對消息的循環處理} } 要在線程中創建一個 Handler,需要先創建 Looper ,創建的方法很簡單:Looper.prepare(); 之后就可以創建 Handler 了。在創建 Handler 之后別忘了調用 Looper.loop(); 這樣才能實現對消息的循環處理。摘自評論區: 推薦博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
主線程和子線程之間的交互的實現 本例的思路: 1. 在主線程中創建兩個Handler對象 handler 和 handler2(圖中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 創建一個子線程 thread ,并啟動 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作為參數),這樣一來handler2就是子線程的 Handler 對象。 4. 重寫 handler 和 handler2 的 handleMessage()方法,在里面創建Message對象,并使用對方的sendMessageDelayed(message,1000);方法發送消息。 5. 定義一個Button,定義點擊事件,由點擊事件觸發如上交互的操作。如上操作中,第4點是核心,也就是兩個 Handler 各自重寫 handleMessage(),方法里面卻是使用對方的 sendMessage() 方法。這樣就實現了主線程和子線程的相互發送信息。 -------------- 摘自評論區,親測有效: 取消發送,經測試,需要將UIhandler 和 threadhandler中的message的what 設置為1,取消的時候要同時removeMessage(1); 1 public class FourActivity extends Activity implements OnClickListener { 2 private Button button1, button2; 3 // 創建主線程的 Handler 4 private Handler handler = new Handler() { 5 public void handleMessage(android.os.Message msg) { 6 Message message = new Message(); 7 System.out.println("----main handler"); 8 // 向子線程發送消息 9 threadHandler.sendMessageDelayed(message, 1000); 10 }; 11 }; 12 13 private Handler threadHandler; 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 // TODO Auto-generated method stub 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.four); 20 button1 = (Button) findViewById(R.id.button1); 21 button2 = (Button) findViewById(R.id.button2); 22 button1.setOnClickListener(this); 23 button2.setOnClickListener(this); 24 HandlerThread thread = new HandlerThread("HandlerThread"); 25 thread.start(); 26 // 創建子線程的Handler 27 threadHandler = new Handler(thread.getLooper()) { 28 @Override 29 public void handleMessage(Message msg) { 30 // TODO Auto-generated method stub 31 Message message = new Message(); 32 System.out.println("----thread handler"); 33 // 向主線程發送消息 34 handler.sendMessageDelayed(message, 1000); 35 } 36 }; 37 } 38 39 @Override 40 public void onClick(View v) { 41 // TODO Auto-generated method stub 42 switch (v.getId()) { 43 case R.id.button1: 44 handler.sendEmptyMessage(1); 45 46 break; 47 case R.id.button2: 48 handler.removeMessages(1); 49 break; 50 } 51 } 52 }
創建一個與自定義線程相關的Handler的代碼: class MyThread extends Thread{public Handler handler;@Overridepublic void run() {Looper.prepare(); // 創建Looper,默認情況是根據當前線程去拿到Looperhandler = new Handler(){ // 與子線程相關的Handler@Overridepublic void handleMessage(Message msg) {System.out.printf("currentThread:"+Thread.currentThread()); // 打印當前線程的id}};Looper.loop(); // 調用該方法實現對消息的循環處理} } 要在線程中創建一個 Handler,需要先創建 Looper ,創建的方法很簡單:Looper.prepare(); 之后就可以創建 Handler 了。在創建 Handler 之后別忘了調用 Looper.loop(); 這樣才能實現對消息的循環處理。摘自評論區: 推薦博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
主線程和子線程之間的交互的實現 本例的思路: 1. 在主線程中創建兩個Handler對象 handler 和 handler2(圖中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 創建一個子線程 thread ,并啟動 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作為參數),這樣一來handler2就是子線程的 Handler 對象。 4. 重寫 handler 和 handler2 的 handleMessage()方法,在里面創建Message對象,并使用對方的sendMessageDelayed(message,1000);方法發送消息。 5. 定義一個Button,定義點擊事件,由點擊事件觸發如上交互的操作。如上操作中,第4點是核心,也就是兩個 Handler 各自重寫 handleMessage(),方法里面卻是使用對方的 sendMessage() 方法。這樣就實現了主線程和子線程的相互發送信息。 -------------- 摘自評論區,親測有效: 取消發送,經測試,需要將UIhandler 和 threadhandler中的message的what 設置為1,取消的時候要同時removeMessage(1); 1 public class FourActivity extends Activity implements OnClickListener { 2 private Button button1, button2; 3 // 創建主線程的 Handler 4 private Handler handler = new Handler() { 5 public void handleMessage(android.os.Message msg) { 6 Message message = new Message(); 7 System.out.println("----main handler"); 8 // 向子線程發送消息 9 threadHandler.sendMessageDelayed(message, 1000); 10 }; 11 }; 12 13 private Handler threadHandler; 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 // TODO Auto-generated method stub 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.four); 20 button1 = (Button) findViewById(R.id.button1); 21 button2 = (Button) findViewById(R.id.button2); 22 button1.setOnClickListener(this); 23 button2.setOnClickListener(this); 24 HandlerThread thread = new HandlerThread("HandlerThread"); 25 thread.start(); 26 // 創建子線程的Handler 27 threadHandler = new Handler(thread.getLooper()) { 28 @Override 29 public void handleMessage(Message msg) { 30 // TODO Auto-generated method stub 31 Message message = new Message(); 32 System.out.println("----thread handler"); 33 // 向主線程發送消息 34 handler.sendMessageDelayed(message, 1000); 35 } 36 }; 37 } 38 39 @Override 40 public void onClick(View v) { 41 // TODO Auto-generated method stub 42 switch (v.getId()) { 43 case R.id.button1: 44 handler.sendEmptyMessage(1); 45 46 break; 47 case R.id.button2: 48 handler.removeMessages(1); 49 break; 50 } 51 } 52 }
?
轉載于:https://www.cnblogs.com/my334420/p/6758675.html
總結
以上是生活随笔為你收集整理的Android攻城狮 Handler与子线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS攻城狮修炼之路
- 下一篇: Android攻城狮 progressB