Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “为什么要避免?”;NetworkOnMainThreadException“;它不起作用了吗?_Java_Android_Udp_Client_Udpclient - Fatal编程技术网

Java “为什么要避免?”;NetworkOnMainThreadException“;它不起作用了吗?

Java “为什么要避免?”;NetworkOnMainThreadException“;它不起作用了吗?,java,android,udp,client,udpclient,Java,Android,Udp,Client,Udpclient,尝试在作为客户端的AndroidStudio Java应用程序与Visual Studio C#服务器之间实现简单的UDP客户端/服务器数据报。我完全确信服务器端正在工作 是UDP客户端,单击按钮“暂时”应将UDP消息发送到端口15000上的本地主机 我的StackTrace弹出了Android.os.NetworkOnMainThreadException错误。我发现我可以使用一个简单的解决方案,即导入StrictMode并将新策略设置为permitAll()。但是,我的应用程序仍然无法工作,

尝试在作为客户端的AndroidStudio Java应用程序与Visual Studio C#服务器之间实现简单的UDP客户端/服务器数据报。我完全确信服务器端正在工作

是UDP客户端,单击按钮“暂时”应将UDP消息发送到端口15000上的本地主机

我的StackTrace弹出了
Android.os.NetworkOnMainThreadException
错误。我发现我可以使用一个简单的解决方案,即导入StrictMode并将新策略设置为permitAll()。但是,我的应用程序仍然无法工作,按钮上几乎什么也没有发生单击“无异常跟踪+无收到消息”,下面是我的代码:

        ButtonOne.setOnClickListener(
                    new Button.OnClickListener() {
                        public void onClick(View v) {
                            TextView TextOne = (TextView) findViewById(R.id.TestText);
                            TextOne.setText("Hi");

                            String host = "127.0.0.1"; // localhost
                            int port = 15000;
                            String message = "Test";
                            DatagramSocket dsocket = null;

                            if (android.os.Build.VERSION.SDK_INT > 9)
                            {
                                StrictMode.ThreadPolicy policy = 
                                        new StrictMode.ThreadPolicy.Builder().permitAll().build();
                                StrictMode.setThreadPolicy(policy);
                            }

                            try {
                                // Get the Internet address of the specified host
                                InetAddress address = InetAddress.getByName(host);

                                // wrap a packet
                                DatagramPacket packet = new DatagramPacket(
                                        message.getBytes(),
                                        message.length(),
                                        address, port);

                                // Create a datagram socket, send the packet through it, close it.
                                dsocket = new DatagramSocket();
                                dsocket.send(packet);
                                dsocket.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
            );
然后我发现这里强烈建议不要使用StrictMode,我需要使用AsyncTask。但是上面说“AsyncTask必须子类化才能使用。子类将重写至少一个方法(doInBackground(Params…),并且通常会重写第二个方法(onPostExecute(Result)),我没有得到,因为每次我在MainActivity类中添加Async时,都会出现错误,这很令人沮丧


对于这个简单的任务,使用StrictMode不合适吗?如果是,为什么不起作用?如果没有,谁能告诉我如何将AsyncTask导入到这段代码中?我应该使用Params、Progress、Result函数吗?

由于您的数据包是发送和遗忘的,并且您不监视其进度或在其末尾执行某些操作,所以您不需要异步任务。您需要在新线程中启动网络活动。下面是代码,可能有一些小的编译问题,因为我现在没有访问权限

ButtonOne.setOnClickListener(
                    new Button.OnClickListener() {
                        public void onClick(View v) {
                            TextView TextOne = (TextView) findViewById(R.id.TestText);
                            TextOne.setText("Hi");


                            String message = "Test";
                            Thread networkThread = new Thread() {


                              String host = "127.0.0.1"; // localhost
                              int port = 15000;
                              DatagramSocket dsocket = null;

                              public void run() {
                                try {
                                // Get the Internet address of the specified host
                                InetAddress address = InetAddress.getByName(host);

                                // wrap a packet
                                DatagramPacket packet = new DatagramPacket(
                                        message.getBytes(),
                                        message.length(),
                                        address, port);

                                // Create a datagram socket, send the packet through it, close it.
                                dsocket = new DatagramSocket();
                                dsocket.send(packet);
                                dsocket.close();
                              } catch (Exception e) {
                                e.printStackTrace();
                            }//catch
                          }//run
                         };// Networkthread
                         networkThread.start();//networkThread.start()
                        }//onClick
                    }//onClickListener
            );//setOnClickListener

此代码未运行,并在.start()部分弹出两个错误:“不兼容的类型:void无法转换为线程”,然后“消息在内部类中使用,应声明为final”。一旦我将其声明为“final”,整个线程就会显示为红色,表示“不兼容类型:Required Java.Lang.thread,Found:Void”。有什么建议吗?谢谢你!注意:如果在同一台机器上使用Android Studio和Visual Studio(服务器客户端),则无法发送到本地IP。需要服务器的实际IP。谢谢伙计。感谢:)。为什么没人提到你的简单解决方案?“简单地创建一个新线程”,您可以使用AsyncTask来完成吗?如果您在doPostExecute()中做了一些响应,或者如果您想发送一个大数据包并想在一个条形图中显示其进度,那么就需要使用AsyncTask,因为通过线程来完成这项工作非常麻烦。