2017-05-22 2 views
-3

私は私のAndroidデバイスとarduino nanoの間の接続を構築しようとします。AsynkThreadしかしNetworkOnMainThreadException

ラズベリーパイと私のarduinoとの間のTCP接続をテストしました。それは動作しています。

は、今私は、Androidアプリを書き込もうが、それは私がAsynkTaskでそれを行うには、いくつかのヒントを見つけ

android.io.NetworkOnMainThreadException 

をスローしますが、それはまだ、この例外がスローされます。私はいくつかの解決策を見つけましたが、私の場合はどちらも助けになりませんでした(例:minAPIを11に設定)。

public class MainActivity extends AppCompatActivity { 

    [...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     [...] 

     bt1.setOnClickListener(new View.OnClickListener(){ 
      public void onClick(View v) { 
       onBtnClick(); 
      } 
     } 
    } 

    public void onBtnClick() { 
     new Client().execute("0101010101"); 
    } 



    private class Client extends AsyncTask<String, Void, String> { 
     protected String doInBackground(String[] params) { 
      // do above Server call here 
      return "null"; 
     } 

     protected void onPostExecute(String msg) { 
      String reply =""; 
      try { 
       reply=sendData(); 
      } catch(IOException e) { 
       e.printStackTrace(); 
       reply = "IOException: "+e; 
      } 
      txt1.setText(reply); 
     } 
     public String sendData() throws IOException{ 

      try { 
       // send message to Arduino 
       InetAddress serverAddr = InetAddress.getByName(ipAddress); 
       DatagramSocket clientSocket = new DatagramSocket(); 

       send_data = str.getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(send_data, send_data.length, serverAddr, portNumber); 
       clientSocket.send(sendPacket); 

       // get reply 
       byte[] receiveData1 = new byte[512]; 
       DatagramPacket receivePacket = new DatagramPacket(receiveData1, receiveData1.length); 
       clientSocket.receive(receivePacket); 

       String reply = new String(receiveData1); 
       clientSocket.close(); 
       return reply; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return("Exception: "+ e); 
      } 
     } 
    } 
} 

何が間違っていますか?ご協力ありがとうございました。

+2

'(ないonPostExecute'で、あなたのネットワークのもののすべてを行うためにどこdoInBackgroundは() 'です) '。 –

+0

あなたは正しいです、ありがとうございます。 –

答えて

2

onPreExecuteとonPostExecuteは、メインスレッド上で動作する方法は、そう、方法のsendDataはdoInBackground上で実行する必要があります

private class Client extends AsyncTask<String, Void, String> { 
     protected String doInBackground(String[] params) { 
      String reply =""; 
      try { 
       reply=sendData(); 
      } catch(IOException e) { 
       e.printStackTrace(); 
       reply = "IOException: "+e; 
      } 
     } 

     protected void onPostExecute(String msg) { 
      txt1.setText(reply); 
     } 
     public String sendData() throws IOException{ 

      try { 
       // send message to Arduino 
       InetAddress serverAddr = InetAddress.getByName(ipAddress); 
       DatagramSocket clientSocket = new DatagramSocket(); 

       send_data = str.getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(send_data, send_data.length, serverAddr, portNumber); 
       clientSocket.send(sendPacket); 

       // get reply 
       byte[] receiveData1 = new byte[512]; 
       DatagramPacket receivePacket = new DatagramPacket(receiveData1, receiveData1.length); 
       clientSocket.receive(receivePacket); 

       String reply = new String(receiveData1); 
       clientSocket.close(); 
       return reply; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return("Exception: "+ e); 
      } 
     } 
    } 
+0

まあ、それは速かった。例外はなくなりました、ありがとうございますが、インスタンス変数に 'reply'をしなければならなかったので、postMethodはこれをまだ知っています。私はarduinoのデータを受け取っていません。しかしこれは別の話題です。 –

関連する問題