• Handler没法取出消息队列中的数据的一个原因


     主线程发送消息到工作线程,工作线程的步骤是固定为3步的。

    1        Looper.prepare();//步骤1,线程里使用handler必须这样写,
    2             handler = new Handler(){//步骤2,先实例化handler
    3                 @Override
    4                 public void handleMessage(Message msg) {
    5                     String receiver = msg.obj.toString();
    6                     System.out.println("receiver:"+receiver+","+Thread.currentThread().getName());
    7                 }
    8             };
    9             Looper.loop();//步骤3 ,循环Looper

    代码如下:

     1 package com.wyl.handler_mars;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.Looper;
     7 import android.os.Message;
     8 import android.util.Log;
     9 import android.view.View;
    10 import android.view.View.OnClickListener;
    11 import android.widget.Button;
    12 import android.widget.TextView;
    13 import android.widget.Toast;
    14 /**
    15  * 主线程发送消息,工作线程接收消息
    16  * @author Wyl
    17  *
    18  */
    19 public class SecondActivity extends Activity implements OnClickListener{
    20     Button btn_fasong;
    21     Handler hand;
    22     Message msg;
    23     TextView tv;
    24     @Override
    25     protected void onCreate(Bundle savedInstanceState) {
    26         // TODO Auto-generated method stub
    27         super.onCreate(savedInstanceState);
    28         setContentView(R.layout.main2);
    29         btn_fasong = (Button) findViewById(R.id.btn_send);
    30         tv = (TextView) findViewById(R.id.tv_01);
    31         btn_fasong.setOnClickListener(this);
    32         Thread t = new MyThread();
    33         t.start();
    34     }
    35     @Override
    36     public void onClick(View v) {
    37         //hand = new Handler();//这一行尤其重要,如果不注释掉,那么下面的线程中就没法接收到消息,因为这行代码中又重新生成了一个handler对象,也就对应着不同的looper,所以就没法
    38         Message msg = hand.obtainMessage();
    39         msg.obj = "无语了。。。";
    40         System.out.println("onClick()...发送:"+"无语了。。。");
    41         hand.sendMessage(msg);//主线程发送消息
    42     }
    43     
    44     
    45     class MyThread extends Thread{
    46         
    47         @Override
    48         public void run() {
    49             Looper.prepare();//获取一个Looper对象
    50             System.out.println("===========");
    51             hand = new Handler(){
    52                 
    53                 @Override
    54                 public void handleMessage(Message msg) {
    55                     // TODO Auto-generated method stub
    56                     System.out.println("MyThread.run()接收到了消息"+",所在线程:"+Thread.currentThread().getName());
    57                 }
    58             };
    59             Looper.loop();
    60         }
    61         
    62     }
    63 }

     ===============分割线===============

    20151008重新总结,具体的说明在注释里有详细的解释,

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"
     5     android:orientation="vertical" >
     6 
     7     <Button
     8         android:id="@+id/btn_send"
     9         android:onClick="doClick"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"
    12         android:hint="发送" />
    13     <Button
    14         android:id="@+id/btn_Cancel"
    15         android:layout_width="match_parent"
    16         android:layout_height="wrap_content"
    17         android:hint="取消发送" />
    18     
    19    
    20 </LinearLayout>

    MainActivity.java

     1 package com.wyl.handler;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.Looper;
     7 import android.os.Message;
     8 import android.view.View;
     9 import android.view.View.OnClickListener;
    10 import android.widget.Button;
    11 
    12 public class MainActivity extends Activity{
    13     Button btn_fs;//发送
    14     Button btn_qx;//取消
    15     Handler handler;
    16     @Override
    17     protected void onCreate(Bundle savedInstanceState) {
    18         super.onCreate(savedInstanceState);
    19         setContentView(R.layout.main);
    20         btn_fs = (Button) findViewById(R.id.btn_send);
    21         btn_qx = (Button) findViewById(R.id.btn_Cancel);
    22         btn_fs.setOnClickListener(new OnClickListener() {
    23             @Override
    24             public void onClick(View v) {
    25                 Message msg = handler.obtainMessage();
    26                 String str = "我是wyl";
    27                 msg.obj = str;
    28                 System.out.println("onClick()发送:"+str+","+Thread.currentThread().getName());
    29                 handler.sendMessage(msg);
    30             }
    31         });
    32         /*
    33          * 这个线程里的handler在onClick()方法之前使用到,所以需要在线程的run()方法里
    34          * 实例化,onClick()方法里就不用实例化了,也不能怪进行重新实例化,否则又是实例化的
    35          * handler对象就不是一个了,handler不一致的话就会导致循环的队列不是同一个,就会
    36          * 导致workThread里的handleMessage()方法没法接收到UIThread发出的消息
    37          */
    38         MyThread t = new MyThread();
    39         t.start();
    40         
    41     }
    42 
    43     class MyThread extends Thread{
    44         @Override
    45         public void run() {
    46             Looper.prepare();//步骤1,线程里使用handler必须这样写,
    47             handler = new Handler(){//步骤2,先实例化handler
    48                 @Override
    49                 public void handleMessage(Message msg) {
    50                     String receiver = msg.obj.toString();
    51                     System.out.println("receiver:"+receiver+","+Thread.currentThread().getName());
    52                 }
    53             };
    54             Looper.loop();//步骤3 ,循环Looper
    55         }
    56     }
    57 
    58 }

     

  • 相关阅读:
    数据结构与算法之“图”
    数据结构与算法之队列、栈
    数据结构与算法之二叉搜索树
    ue mobile GI
    ue ios 用xcode 断点debug手机 显示call stack的环境搭建 /instrument 显示线程名/stat filestart
    ue 后效里宏的设置
    ue上 sceneColorMobile 在android 和ios上表现不同的问题
    减少ue编译shader的时间
    ue 搭建android/ios联机 debug环境
    对曝光的理解 autoExposure
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4859868.html
Copyright © 2020-2023  润新知