本人菜鸟,请教一个handleMessage不执行的问题 本帖最后由 meliuzhifeng 于 2012-06-04 11:13:46 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把Handler中接收消息的方法public void handleMessage(Message msg) 改为public void dispatchMessage(Message msg) 改了,但是DEBUG跟踪,还是不执行 hander直接这样new hander = new Handler() { public void dispatchMessage(Message mes) { //.... } } 按照您说的改了一下,还是不行,不知道改的对不对,我原来的代码中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; } } }主要代码我基本列出来了,帮我看一下 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); //... } 还是要麻烦你,按你这种方法谢了,但是如果加上了handler.sendEmptyMessage(0);就会出错,如果不加,也是无法执行。 06-04 13:27:24.753: ERROR/AndroidRuntime(8504): java.lang.NullPointerException06-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) 我现在的情况是这样,我才接触android不久,正在改造一个原有的代码。原来的代码是这个Activity,finish()之后程序就关闭了,所以handleMessage这个问题不存在,但是我做了一个按钮的界面,点击按钮才执行这个Activity,第一次进去正常,按后退键,在点击按钮进入时候,handleMessage就不执行了 looper = Looper.myLooper();handler = new EventHandler(looper);把这段代码放到onResume()里执行应该就好了 @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); looper = Looper.myLooper(); handler = new EventHandler(looper); }谢谢。加上了 但是还是不好使 case 0: userOnLine(msg.obj.toString()); break;76行就是走到这里出错了,好像是msg没有获取到内容 looper不对,有可能被消掉了。你给的code看不出来发消息的。 楼主的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);}@Overridepublic 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); }}} 前面的回答有误,我重新改了下 你试下看你可以创建一个线程队列试下,将消息添加到线程队列当中,帮你改造下吧 你试下看。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 {@Overridepublic 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); }} 楼上的,如果只要一个what,那直接 handler.sendEmptyMessage(0);就可以了。楼主已经正确接收到Handler的消息了,只是报了空指针异常:06-04 13:27:24.753: ERROR/AndroidRuntime(8504): java.lang.NullPointerException06-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); }; 不在执行的问题原因: onCreate()方法不是每次启动界面都会执行的,当界面使用finish()后界面被保存到堆栈。第二次启动该界面时是不会在执行onCreate()方法的,而且在这之前也没有保存该界面对象的原型。所以在finish()后实际上handler和loop都是空的。所以不会执行。处理方法:(1)将对象handler做为静态对象使用。(2)采用onSaveInstanceState保存界面原型。(3)在声明handler时初始化其定义。 EditText 怎么能够不让软键盘自动弹出? android中我怎么把一个listview弄到AlertDialog列表上面? android 数组 使用类成员时遇到的问题 相对布局显示的问题..求指导求教育... 按照步骤安装的,但是android虚拟机启动不了 修改 launcher的 hotseat_bg_xxxxx的问题 如何在程序里打开gps和gprs啊? 分析log方法 OutputStream close时出现java.lang.NullPointerException,在线等,发现问题在哪儿了下次多给你点分 android应用在摩托罗拉928上无法全屏显示的问题
public void handleMessage(Message msg)
改为
public void dispatchMessage(Message msg)
public void dispatchMessage(Message mes) {
//....
}
}
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;
}
}
}主要代码我基本列出来了,帮我看一下
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);
//...
}
还是要麻烦你,按你这种方法谢了,但是如果加上了handler.sendEmptyMessage(0);就会出错,如果不加,也是无法执行。
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)
handler = new EventHandler(looper);
把这段代码放到onResume()里执行应该就好了
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
looper = Looper.myLooper();
handler = new EventHandler(looper);
}
谢谢。加上了 但是还是不好使
case 0:
userOnLine(msg.obj.toString());
break;76行就是走到这里出错了,好像是msg没有获取到内容
当你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); }}
}
前面的回答有误,我重新改了下 你试下看
你可以创建一个线程队列试下,将消息添加到线程队列当中,帮你改造下吧 你试下看。
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); }}
楼主已经正确接收到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);
};
onCreate()方法不是每次启动界面都会执行的,当界面使用finish()后界面被保存到堆栈。第二次启动该界面时是不会在执行onCreate()方法的,而且在这之前也没有保存该界面对象的原型。所以在finish()后实际上handler和loop都是空的。
所以不会执行。
处理方法:
(1)将对象handler做为静态对象使用。
(2)采用onSaveInstanceState保存界面原型。
(3)在声明handler时初始化其定义。