Получаю android.os.NetworkOnMainThreadException хотя у меня в коде прописан запуск в другом потоке
У меня есть 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)
Источник: Stack Overflow на русском