2011-08-11 17 views
0

スレッド内のクラスレベルの変数にアクセスするにはどうすればよいですか?変数に直接アクセスしようとしましたが、例外が発生しました。スレッド内のクラスレベルの変数にアクセスすることは可能ですか、ハンドラを使用する必要がありますか?スレッド内のクラスレベルの変数へのアクセス

ここは私のコードです。

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]; でnullポインタ例外です。そう、あなたは明らかにnullポインタ例外私に構文的に有効なJavaのようには見えません

+0

"例外が発生しました"という情報は役に立ちません。 http://tinyurl.com/so-hintsを読んで質問を編集してください。 –

+0

コードスニペットは、トークンが宣言されている場所、初期化されている場所のみを示しません。 – shelley

答えて

2

を取得 -

+0

これは完全なコードではありません。私はまもなくデモンストレーションを行います。コンパイル時エラーはありません。 – Siddiqui

+0

今すぐご確認ください。 – Siddiqui

+0

ありがとう、私はあなたのポイントを得た。 – Siddiqui

-1

あなたのデバイスIDは、[]はnull以外のものに配列を初期化したことがないようです。 ClassToken = token;が認識されないことを示すコンパイルエラーが発生しているはずです。そして、それを過ぎていたら、run()メソッドを宣言していないと言っています。セミコロンがありません。


あなたがエラーを与えている本当コードを投稿する気たい場合、我々は本当の問題が何であるかを伝えることができるかもしれません。


問題は、あなたがnullではなく、配列にDevice_IDを初期化していることです。 nullのインデックスを作成しようとすると、NPEが表示されます。

簡単な修正はに初期化を変更することです:。(与えられたとして、あなたがすべてで配列を使用する必要がある理由あなたのコードから、私が見ることができない理由だけDevice_IDStringをしない

String[] Device_ID = new String[1]; 

?OTOH、おそらくこれはあなたのデモンストレーションコードの人為的なものです...)

関連する問題