2011-08-11 6 views
0

Comment puis-je accéder aux variables de niveau classe à l'intérieur du thread, j'ai essayé d'accéder à la variable directement mais l'exception se produit. Est-il possible d'accéder à la variable de niveau classe à l'intérieur du thread ou je dois utiliser handler?Accès à la variable de niveau Classe dans le thread

Voici mon code.

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 
      //*************************************************************************************** 




} 

Une exception est l'exception du pointeur nul à Device_ID[0] = tokens[1]; cette ligne.

+0

" l'exception se produit "ne nous donne aucune information utile. Veuillez lire http://tinyurl.com/so-hints et éditez votre question en conséquence. –

+0

L'extrait de code n'indique pas où les jetons sont déclarés, uniquement là où ils sont initialisés. – shelley

Répondre

2

Cela ne ressemble pas syntaxiquement valide Java pour moi. Vous devriez avoir vu une erreur de compilation vous indiquant que ClassToken = token; n'est pas reconnu. Et si cela s'était passé, un autre disait que vous n'aviez pas déclaré la méthode run(). Et il y a un point-virgule manquant.


Si vous soin d'afficher le code réel qui donne l'erreur, nous pourrions être en mesure de vous dire quel est le problème réel est.


Le problème est que vous avez initialisé Device_ID à null plutôt qu'un tableau. Lorsque vous essayez d'indexer un null, vous obtiendrez un NPE.

La solution simple est de changer l'initialisation.

String[] Device_ID = new String[1]; 

(De votre code comme indiqué, je ne vois pas pourquoi vous avez besoin d'utiliser un tableau du tout Pourquoi ne pas simplement faire un Device_IDString "OTOH, peut-être c'est juste un artefact de votre code de démonstration ...)

+0

ce n'est pas le code complet, j'ai écrit sous peu pour la démonstration. il n'y a pas d'erreur de compilation. – Siddiqui

+0

Veuillez vérifier maintenant. – Siddiqui

+0

Merci beaucoup, j'ai compris. – Siddiqui

-1

Il semble que vous ne tableau initialisé deviceId [] pour quoi que ce soit, sauf nul - si vous obtenez clairement NullPointerException

Questions connexes