阅读背景:

handler 空指针异常_sangsa的博客

来源:互联网 
0-12 17:39:18.127    6758-6795/com.example.administrator.socketclienttest E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-8671
    Process: com.example.administrator.socketclienttest, PID: 6758
    java.lang.NullPointerException
            at com.example.administrator.socketclienttest.SocketClient
0-12 17:39:18.127    6758-6795/com.example.administrator.socketclienttest E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-8671
    Process: com.example.administrator.socketclienttest, PID: 6758
    java.lang.NullPointerException
            at com.example.administrator.socketclienttest.SocketClient$1.run(SocketClient.java:77)

由于要有多个activity,共享一个接收数据的线程,单独通过一个线程去接收服务器的数据,并通过handler的sendmessage发送给界面activity,在activity中handlemessage,但是一直出现如上问题,检测情况如下:

     1,从客户端发送数据到服务器可以,服务器可以收到,但是客户端页面没有显示服务器发过来的数据,;

     2, 并且点击发送按钮时,app退出,报出以上错误。

处理过程:

   1   开始,以为是服务器没有成功回复数据给客户端;因为从客户端发送数据过去是可以完成的,他两机制也一样,因此不会是实现过程的问题;

          于是,就用eclipse所写的客户端进行检测,结果发现服务器是没有问题的;

   2,服务器问题排出,肯定在客户端,由于代码中关于handler部分总是绿色背景,并且总给出warn:

        In Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class.

      以为是这个原因,于是查到了他的几种解决办法,但是都没太懂

3,最后还是回归到,所报出的错误,既然错误指向handler,那肯定是handler用错了,于是又再次去学习了handler的教程,结果找到问题了,自己更新UI的方式,放在了主线程中;

    这是报错的代码:

//    private Handler  handler = new Handler() {
//
//        @Override
//        public void handleMessage(Message msg) {
//            // 如果消息来自子线程
//            if (msg.what == 0x123) {
//                // 将读取的内容追加显示在文本框中
//                output.append("\n" + msg.obj.toString());
//            }
//        }
//    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InitView();

        clientThread = new SocketClient(handler);
        // 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
        new Thread(clientThread).start();

          handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                // 如果消息来自子线程
                if (msg.what == 0x123) {
                    // 将读取的内容追加显示在文本框中
                    output.append("\n" + msg.obj.toString());
                }
            }
        };


    }
修改后的代码:

 private Handler  handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // 如果消息来自子线程
            if (msg.what == 0x123) {
                // 将读取的内容追加显示在文本框中
                output.append("\n" + msg.obj.toString());
            }
        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InitView();

        clientThread = new SocketClient(handler);
        // 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
        new Thread(clientThread).start();
        


    }



.run(SocketClient.java:77)0-12 17:39:18.127 6758-6795/com.example.admi



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: