访问线程中的类级变量

时间:2011-08-11 09:56:36

标签: java android

如何访问线程内的类级变量,我试图直接访问变量但发生异常。是否可以访问线程内的类级变量,或者我必须使用handler?

这是我的代码。

public class MainMapActivity extends MapActivity 
        {    
            //***************************************************************************************
            //isRouteDisplayed Method (Override)
            @Override
            protected boolean isRouteDisplayed() 
            {
                return false;
            }//End method
            //***************************************************************************************
            //private Handler handlerTimer = new Handler();

            //***************************************************************************************
            //Class Level Variables & Objects

            String[] Device_ID = null;

            //***************************************************************************************
            //onCreate method (Override the built-in method) Called when the activity is first created.
            @Override
            public void onCreate(Bundle savedInstanceState) 
            {

                //handlerTimer.removeCallbacks(taskUpdateStuffOnDialog);
                //handlerTimer.postDelayed(taskUpdateStuffOnDialog , 100); 


               //service = new NewService();

               new Thread(taskUpdateStuffOnDialog).start(); 
                // GIve the Server some time for startup   
                try 
                {  
                       Thread.sleep(500);  
                } 
                catch (InterruptedException e)
                { 

                }  

               // Kickoff the Client  
               // startService(new Intent(this, NewService.class));
                new Thread(new NewService()).start(); 



            }//End onCreate 
            //***************************************************************************************

            private Runnable taskUpdateStuffOnDialog = new Runnable() 
            {

                public void run() 
                {  
                    GlobalVariable appState = ((GlobalVariable)getApplicationContext());
                    try
                    {
                         serverAddr = InetAddress.getByName(SERVERIP);  
                         Log.d("UDP", "S: Connecting...");  
                        /* Create new UDP-Socket */  
                         socket = new DatagramSocket(SERVERPORT, serverAddr);  

                    }
                    catch (Exception e)
                    {
                        Log.e("UDP", "S: Error", e);  

                    }

                    while(true)
                    {
                            // TODO Auto-generated method stub  
                            try 
                            {  
                                         /* Retrieve the ServerName */  
                                         /* By magic we know, how much data will be waiting for us */  
                                         byte[] buf = new byte[72];  
                                         /* Prepare a UDP-Packet that can 
                                         * contain the data we want to receive */ 

                                         DatagramPacket packet = new DatagramPacket(buf, buf.length);  
                                         Log.d("UDP", "S: Receiving...");  


                                         /* Receive the UDP-Packet */  
                                         socket.receive(packet);

                                         String id = new String(packet.getData());

                                         //buffer.order(ByteOrder.LITTLE_ENDIAN);  // if you want little-endian



                                        String[] tokens = id.split(" ");
                                         String b = tokens[0];

                                         Log.d("Message:   ", b + " "  );
                                /***************************** sending  device ID *************************************/


                                else if(b.equals("5"))
                                {
                                    Device_ID[0] = tokens[1];

                                    runOnUiThread(new Runnable()
                                    {
                                        public void run() 
                                        {

                                            String id = tokens[1];
                                            Log.d("UDP", "S: Received Device ID: '" + id + "'");


                                            setID(id);
                                            //positionOverlay.setID(id);
                                            //addEvent(id);
                                            Toast.makeText(MainMapActivity.this, "Your Device ID " + id,Toast.LENGTH_LONG).show();
                                        }
                                    });
                                    //Toast.makeText(MainMapActivity.this, "Your Device ID " + b,Toast.LENGTH_LONG).show();

                                } // end else if


                           } // end try
                            catch (Exception e)
                           {  
                                Log.e("UDP", "S: Error", e);  
                           } // end catch  

                            //handlerTimer.postDelayed(this, 100);
                      } // end while condition  
                    //***************************************************************************************
                  }//End Run method
              //***************************************************************************************
            };//End Thread
            //***************************************************************************************




}

异常是此行Device_ID[0] = tokens[1]; 处的空指针异常。

2 个答案:

答案 0 :(得分:2)

对我来说,这看起来不像语法上有效的Java。您应该看到编译错误,告诉您ClassToken = token;未被识别。如果它已经过了那个,那么另一个人说你没有宣布run()方法。并且缺少分号。


如果您想发布提供错误的真实代码,我们可能会告诉您真正的问题是什么。


问题是您已将Device_ID初始化为null而不是数组。当您尝试索引null时,您将获得一个NPE。

简单的解决方法是将初始化更改为:

String[] Device_ID = new String[1];

(从您给出的代码中,我看不出为什么你需要使用数组。为什么不让Device_ID成为String?OTOH,也许这只是一个人工制品你的演示代码......)

答案 1 :(得分:-1)

似乎你从来没有将数组deviceId []初始化为除null之外的任何东西 - 所以你明显得到空指针异常