2017-07-19 18 views
0

私はWifiのクライアント通信で自分のコードについて質問したいと思います。私はサーバーとしてラズベリーパイと通信しています。 私のコードのアーキテクチャは次のとおりです。Android wifi:ハンドラmsgが動作しない

  • 主な活動:私はHandlerクラスを持っていると私はWiFi接続を確立するの面倒をOnCreat最初のスレッド(スレッド1)で起動します。

    public class MainActivity extends AppCompatActivity { 
    public int serverPort = 40000; 
    public String serverIP = "10.177.86.212"; 
    public WiFiConnector wifiConnection; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    
    editTextWE = (EditText) findViewById(R.id.editText_WE); 
    
    wifiConnection = new WiFiConnector(serverIP, serverPort); 
    
    Handler mHandler = new MyHandler(); 
    
    WiFiConnector.Thread1 = new Thread(new WiFiConnector.Thread1(mHandler,true)); 
    WiFiConnector.Thread1.start(); 
    } 
    
    private class MyHandler extends Handler { 
    private byte[] bytes = null; 
    
    @Override 
    public void handleMessage(Message msg) { 
         bytes = msg.getData().getByteArray("KEY"); 
         if(bytes!= null){ 
         for (int i = 0; i < bytes.length; i++){ 
          Log.d("Data received", "value " + (0xFF & bytes[i])); 
         } 
    
         for (int i=0; i<bytes.length; i++) { 
          editTextWE.setText(editTextWE.getText()+ "Server says: " + bytes.length + " "+ (0xFF & bytes[i]) + "\n"); 
         } 
        } 
    } 
    } 
    } 
    
    • WifiConnectorクラス:スレッド1とスレッド2が主な活動から来るハンドラを共有しています。 Thread1はRaspberry Piにコマンドを送信してデータの送信を開始させます。 Thread2は、サーバーから受信したデータを読み込むためのものです。

      public class WiFiConnector { 
      
      static String serverIP; 
      static int serverPort; 
      public static Thread Thread1 = null; 
      
      //Constructor 
      public WiFiConnector(String IP, int port) { 
      serverIP = IP; 
      serverPort = port; 
      } 
      
      public static class Thread1 extends Thread implements Runnable { 
      
      private Handler handler1; 
      boolean firsttime = false; 
      OutputStream out ; 
      
      public Thread1(Handler handler_1, boolean firsttime) { 
      this.handler1 = handler_1; 
      this.firsttime = firsttime; 
      } 
      
      public void run() { 
      Socket socket = null; 
      
      try { 
      
          //Writing to a Socket 
          InetAddress serverAddress = InetAddress.getByName(serverIP); 
          socket = new Socket(serverAddress, serverPort); 
      
          out = new DataOutputStream(socket.getOutputStream()); 
          if(firsttime){ 
          //I send "B" to Raspberry to let him start sending data 
          out.write("B".getBytes()); 
          this.fisrttime = false; 
          } 
      
          Thread2 comThread = new Thread2(socket, handler1); 
          new Thread(comThread).start(); 
      
      } catch (UnknownHostException e) { 
          e.printStackTrace(); 
      } catch (IOException e) { 
          e.printStackTrace(); 
      } 
      } 
      } 
      
      public static class Thread2 implements Runnable { 
      
      public Socket clientSocket; 
      private Handler handler_2; 
      public DataInputStream in; 
      public byte[] bytes = new byte[13]; 
      public Message msg; 
      
      public Thread2(Socket clientSocket, Handler handler2) { 
      this.clientSocket = clientSocket; 
      this.handler_2 = handler2; 
      } 
      
      public void run() { 
      
      while (!Thread.currentThread().isInterrupted()) { 
      
          try { 
      
           if (Looper.myLooper() == null) { 
            Looper.prepare(); 
           } 
      
           this.in = new DataInputStream(clientSocket.getInputStream()); 
           in.readFully(bytes); 
      
           if (in != null) { 
            for (int i = 0; i < bytes.length; i++){ 
             Log.d("Data received", "valuewifi " + (0xFF & bytes[i])); 
            } 
      
            msg = new Message(); 
            Bundle b = new Bundle(); 
            b.putByteArray("KEY", bytes); 
            msg.setData(b); 
            handler_2.sendMessage(msg); 
           } else { 
            Thread1 = new Thread(new Thread1(handler_2,false)); 
            Thread1.start(); 
            return; 
           } 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
      } 
      Looper.loop(); 
      } 
      } 
      } 
      

NOW問題です: 私は確かに、ラズベリーパイから(13バイトごとのパッケージ)が正しく私のデータを受信して​​います:

Log.d("Data received", "valuewifi " + (0xFF & bytes[i])); 

正しく印刷私の値を。 MainActivityのハンドラに送るメッセージを作成します。

Log.d("Data received", "value " + (0xFF & bytes[i])); 

(私は2を取得しようとしています各メッセージの最初のバイトの値を代入:バンドルは、入力ストリームの同じ値を受信しますが、MainActivityのハンドラに印刷されたメッセージは、(私が確認している)が含まれRPiとの各通信をパッケージ化します)66で、実際にはRaspberry Piからのデータ送信を開始するために送信した「B」のASCIIコードです。

あなたはこの身分証明書をお持ちですか?事前にあなたの助けのための 多くの感謝!:)

答えて

0

まあ、私はスレッド2に、私は

in.readFully(bytes); 

交換の前に実行{..}内

public byte[] bytes = new byte[13]; 

を置けばことを発見しましたメッセージは完全に発生します。さもなければ、私はMainActivityをサーバから受け取ったバイトの最後のパッケージに入れます。

なぜそれが起こるのですか? ありがとう!

関連する問題