本帖最后由 meliuzhifeng 于 2012-06-04 11:13:46 编辑

解决方案 »

  1.   

    把Handler中接收消息的方法
    public void handleMessage(Message msg) 
    改为
    public void dispatchMessage(Message msg)
      

  2.   

    改了,但是DEBUG跟踪,还是不执行
      

  3.   

    hander直接这样new hander = new Handler() {
    public void dispatchMessage(Message mes) {
    //....
    }
     }
      

  4.   

    按照您说的改了一下,还是不行,不知道改的对不对,我原来的代码中Handler是一个全局变量。我再详细的贴一下代码吧。
    public class ShowView extends passwordInterface implements OnGestureListener,
    OnItemClickListener, OnTouchListener {
    private Handler handler;
    private Looper looper;
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.showview); looper = Looper.myLooper();
    handler = new EventHandler(looper);
    thread = new Thread(viewThread);
    thread.start();
    } class EventHandler extends Handler {
    public EventHandler(Looper looper) {
    super(looper);
    } @Override
    public void dispatchMessage(Message msg) {
    switch (msg.what) {
    case 0:
    userOnLine(msg.obj.toString());
    break;
    case 1:
    userOffLine(msg.obj.toString());
    break;
    }
    }
    }主要代码我基本列出来了,帮我看一下
      

  5.   


    private Handler handler = new Handler() {
    public void dispatchMessage(android.os.Message msg) {
    switch (msg.what) {
    case 0:
    userOnLine(msg.obj.toString());
    break;
    case 1:
    userOffLine(msg.obj.toString());
    break;
    }
    };
    }; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    handler.sendEmptyMessage(0);
    //...
    }
      

  6.   


    还是要麻烦你,按你这种方法谢了,但是如果加上了handler.sendEmptyMessage(0);就会出错,如果不加,也是无法执行。
      

  7.   

    06-04 13:27:24.753: ERROR/AndroidRuntime(8504): java.lang.NullPointerException
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at com.yuhong.android.ShowView$1.dispatchMessage(ShowView.java:76)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at android.os.Looper.loop(Looper.java:123)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at java.lang.reflect.Method.invoke(Method.java:521)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504):     at dalvik.system.NativeStart.main(Native Method)
      

  8.   

    我现在的情况是这样,我才接触android不久,正在改造一个原有的代码。原来的代码是这个Activity,finish()之后程序就关闭了,所以handleMessage这个问题不存在,但是我做了一个按钮的界面,点击按钮才执行这个Activity,第一次进去正常,按后退键,在点击按钮进入时候,handleMessage就不执行了
      

  9.   

    looper = Looper.myLooper();
    handler = new EventHandler(looper);
    把这段代码放到onResume()里执行应该就好了
      

  10.   


    @Override
    protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    looper = Looper.myLooper();
    handler = new EventHandler(looper);
    }
    谢谢。加上了 但是还是不好使
      

  11.   


    case 0:
                    userOnLine(msg.obj.toString());
                    break;76行就是走到这里出错了,好像是msg没有获取到内容
      

  12.   

    looper不对,有可能被消掉了。你给的code看不出来发消息的。
      

  13.   

    楼主的msg都没接收到msg的what的值当然不会执行呀?
    当你Handler.sendMessage()的时候要指定Message的what值啊你可以创建一个线程队列试下,将消息添加到线程队列当中,帮你改造下吧 你试下看。
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.showview);looper = Looper.myLooper();
    handler = new EventHandler(looper);
    //创建Thread对象,并调用start()方法
      Thread th = new Thread(rb);
      rb.start();
    };class EventHandler extends Handler {
    public EventHandler(Looper looper) {
    super(looper);
    }@Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case 0:
    userOnLine(msg.obj.toString());
    break;
    case 1:
    userOffLine(msg.obj.toString());
    break;
    }
    }
    //创建线程
    private Runnable rb = new Runnable(){
      @Override
      public void run(){//实现run方法
      Message msg = new Message();
      msg.what =0;
      //向handler发送消息
      handler.sendMessage(msg);  }}
    }
      

  14.   


    前面的回答有误,我重新改了下 你试下看
    你可以创建一个线程队列试下,将消息添加到线程队列当中,帮你改造下吧 你试下看。
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.showview);
    //创建Thread对象,并调用start()方法
      Thread th = new Thread(rb);
      th.start();
    };class EventHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case 0:
    userOnLine(msg.obj.toString());
    break;
    case 1:
    userOffLine(msg.obj.toString());
    break;
    }
    }
    //创建线程
    private Runnable rb = new Runnable(){
      @Override
      public void run(){//实现run方法
      Message msg = new Message();
      msg.what =0;
      //向handler发送消息
      handler.sendMessage(msg);  }}
      

  15.   

    楼上的,如果只要一个what,那直接 handler.sendEmptyMessage(0);就可以了。
    楼主已经正确接收到Handler的消息了,只是报了空指针异常:
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504): java.lang.NullPointerException
    06-04 13:27:24.753: ERROR/AndroidRuntime(8504): at com.yuhong.android.ShowView$1.dispatchMessage(ShowView.java:76)
    79行:userOnLine(msg.obj.toString());
    从这里看出来有可能是msg为空 或者obj为空,所以在发送Message时用这样的方式: private Handler handler = new Handler() {
    public void dispatchMessage(android.os.Message msg) {
    switch (msg.what) { // 这里是可以收到值的
    //接下来就要使用到msg.obj对象,如果在发送消息时没有对它进行赋值就会抛空指针了
    case 0:
    userOnLine(msg.obj.toString());
    break;
    case 1:
    userOffLine(msg.obj.toString());
    break;
    default:
    break;
    }
    };
    }; protected void onCreate(android.os.Bundle savedInstanceState) {
    Message message=new Message();
    //设置下列两个属性
    message.what=0;
    message.obj="test";
    handler.sendMessage(message);
    };
      

  16.   

    不在执行的问题原因:
     onCreate()方法不是每次启动界面都会执行的,当界面使用finish()后界面被保存到堆栈。第二次启动该界面时是不会在执行onCreate()方法的,而且在这之前也没有保存该界面对象的原型。所以在finish()后实际上handler和loop都是空的。
    所以不会执行。
    处理方法:
    (1)将对象handler做为静态对象使用。
    (2)采用onSaveInstanceState保存界面原型。
    (3)在声明handler时初始化其定义。