Получаю android.os.NetworkOnMainThreadException хотя у меня в коде прописан запуск в другом потоке

Рейтинг: 0Ответов: 0Опубликовано: 04.06.2023

У меня есть main activity, в нем я запускаю обычный service, а в нем запускаю код TcpClient класса. В конструкторе которого запускаю: Код TcpClient.class:

public class TcpClient implements Runnable
{
    private Thread thread;
    private Socket socket;
    private PrintWriter dataOutputStream;
    private BufferedReader dataInputStream;

    public TcpClient() {
        this.thread = new Thread( this );
        this.thread.setPriority( Thread.NORM_PRIORITY );
        this.thread.start();
    }

   // была main()

    private Object jsonToObjet(String json, Class<?> clazz) {

        JsonParser parser = new JsonParser();
        JsonElement mJson =  parser.parse(json);
        Gson gson = new Gson();
        return gson.fromJson(mJson, clazz);

    }

    private String objectToJson(Object object) {

        Gson gson = new Gson();
        return gson.toJson(object);
    }

    @Override
    public void run()
    {
        try
        {
// create new socket and connect to the server
            this.socket = new Socket( "tcp://6.tcp.eu.ngrok.io:13209" , 80 );
        }
        catch( IOException e )
        {
            System.out.println( "failed to create socket" );
            e.printStackTrace();
        }

        System.out.println( "connected" );

        try
        {
            this.dataOutputStream = new PrintWriter(this.socket.getOutputStream(), true); // ввод данных, от меня серверу
            this.dataInputStream = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); // чтение, от сервера
        }
        catch ( IOException e )
        {
            System.out.println( "failed to create streams" );
            e.printStackTrace();
        }

        while ( true )
        {
            try
            {
                MyHandlers handlers = new MyHandlers();
                String responseJSON = "Error 404";
                POST_JSON post;
                GET_JSON get;

                String requestJson = this.dataInputStream.readLine();
                get = (GET_JSON) jsonToObjet(requestJson, GET_JSON.class);

                // отправка запроса в обработчик:

                if(get.getHeader().equals("sms_chat")) {
                    post = handlers.sms_chat(get);
                    responseJSON = objectToJson(post);
                }
                // if() {}
                // ...


                this.dataOutputStream.write(responseJSON);



            }
            catch ( IOException e )
            {
                System.out.println( "failed to read data" );
                e.printStackTrace();
                break;
            }
        }
    }
}

Код MyService.class

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // http://4.tcp.eu.ngrok.io:19120 80

        TcpClient tcpClient = new TcpClient();
        tcpClient.run();

        return START_STICKY;
    }

Код MyHandlers.class

public class MyHandlers {

    public POST_JSON sms_chat(GET_JSON get) {

        POST_JSON post = new POST_JSON();
        post.setHeader(get.getHeader());
        post.setBody("Hello my test friend!");

        return post;
    }
}

Код MainActivity.class:

startService(new Intent(this, MyService.class));

Этот код я запускал и в onCreate(), и в onStart() - исключение не поменялось.

P.s весь остальной код базовый, который предоставляет Android Studio при создании приложения.

И благополучно получаю исключение. Не могу понять чем ему не новый поток? Ну т.е зачем тогда вообще разработчику использовать Thread если он будет запускаться в том же потоке, синхронно, ведь суть этого кода производить асинхронность..

Полная формулировка исключения:

FATAL EXCEPTION: main
                                                                                                    Process: com.test.myapp, PID: 2113
                                                                                                    java.lang.RuntimeException: Unable to start service com.test.myapp.MyService@484fb59 with Intent { cmp=com.test.myapp/.MyService }: android.os.NetworkOnMainThreadException
                                                                                                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4673)
                                                                                                        at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(Unknown Source:0)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2180)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7872)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
                                                                                                    Caused by: android.os.NetworkOnMainThreadException
                                                                                                        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1667)
                                                                                                        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
                                                                                                        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
                                                                                                        at java.net.InetAddress.getAllByName(InetAddress.java:1152)
                                                                                                        at java.net.Socket.<init>(Socket.java:243)
                                                                                                        at com.test.myapp.TcpClient.run(TcpClient.java:65)
                                                                                                        at com.test.myapp.MyService.onStartCommand(MyService.java:38)
                                                                                                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4655)
                                                                                                        at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(Unknown Source:0) 
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2180) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201) 
                                                                                                        at android.os.Looper.loop(Looper.java:288) 
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7872) 
                                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 

Ответы

Ответов пока нет.