【问题标题】:AsynkThread but still NetworkOnMainThreadExceptionAsynkThread 但仍然是 NetworkOnMainThreadException
【发布时间】:2017-05-22 19:24:49
【问题描述】:

我尝试在我的 android 设备和 arduino nano 之间建立连接。

我测试了树莓派零和我的 arduino 之间的 TCP 连接,它可以正常工作并完成它应该做的事情。

现在我尝试编写 android 应用程序,但它抛出了

android.io.NetworkOnMainThreadException

我发现了一些使用 AsynkTask 执行此操作的提示,但它仍然会引发此异常。我找到了一些解决方案,但在我的情况下都没有帮助(例如:将 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);
            }
        }
    }
}

我做错了什么?感谢您的帮助。

【问题讨论】:

  • doInBackground() 是处理所有网络工作的地方,而不是 onPostExecute()
  • 你说得对,谢谢。

标签: android android-asynctask networkonmainthread


【解决方案1】:

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);
            }
        }
    }

【讨论】:

  • 嗯,这很快。异常消失了,谢谢,但我必须将reply 设置为实例变量,所以 postMethod 仍然知道这一点。我没有收到关于我的 arduino 的任何数据。但这是另一个话题。
猜你喜欢
  • 2016-12-11
  • 2015-07-26
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多