【问题标题】:how should i implement UDP in AsyncTask? [duplicate]我应该如何在 AsyncTask 中实现 UDP? [复制]
【发布时间】:2019-10-03 13:54:06
【问题描述】:

我正在通过 UDP 协议发送一些数据包,但应用程序在 UDP 类的这一部分(如下所示)因 NetworkOnMainThreadException 错误而崩溃:

client_socket.send(send_packet);

通过搜索错误,我发现在这种情况下应该使用 AsyncTask(我对此不确定,任何想法)。那么我怎样才能在这段代码中实现 AsynkTask 以解决错误呢?下面是我的 UDP 类:

public class CheckIP {

    private String CheckState;
    private String IP;

    //UDP IP Seraching
    private byte[] send_data = new byte[1024];
    private byte[] receiveData = new byte[1024];

    public CheckIP(final String BN, final Context context) throws IOException {

        DatagramSocket client_socket = new DatagramSocket(2222);
        InetAddress IPAddress = InetAddress.getByName("255.255.255.255");

        String str = String.valueOf(BN.charAt(7) + BN.charAt(5) + BN.charAt(8) + BN.charAt(3));
        send_data = str.getBytes();

        DatagramPacket send_packet = new DatagramPacket(send_data, str.length(), IPAddress, 2222);
        client_socket.send(send_packet);

        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        client_socket.receive(receivePacket);

        CheckState = "true";
        IP = receivePacket.getAddress().toString();
     }

    public String getIP() {
        return IP;
    }

    public String getCheckState() {
        return CheckState;
    }
}

以及我 home.class 中的相关代码:

additembtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                  try {
                        Buildnumber = "123456789";
                        CheckIP checkIP = new CheckIP(Buildnumber,home.this);
                        if (checkIP.getCheckState().equals("true")){
                            //show Toast
                        }else{
                            //show Toast
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

【问题讨论】:

    标签: java android exception android-asynctask


    【解决方案1】:

    创建另一个异步任务类

     private class UDPTask extends AsyncTask<URL, Integer, CheckIP> 
     {
     protected CheckIPdoInBackground(URL... urls) {
    
          Buildnumber = "123456789";
          CheckIP checkIP = null;
            try {
                checkIP = new CheckIP(Buildnumber, home.this);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
         return checkIP;
     }
    
     protected void onProgressUpdate(Integer... progress) {
     }
    
     protected void onPostExecute(CheckIP checkIP) {
    
       if (checkIP.getCheckState().equals("true")){
                            //show Toast
                        }else{
                            //show Toast
                        }
     }
     }
    

    然后使用此代码在点击时调用它:

    new UDPTask().execute();
    

    【讨论】:

    • 无法解决 setProgressPercent... checkIP 应更改为导致 onPostExecute 和 CheckIP checkIP = new CheckIP(Buildnumber,home.this);我应该尝试/捕获并且长参数应该是 CheckIP...感谢整体回答
    猜你喜欢
    • 2021-03-24
    • 2012-03-04
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多