使用socketjava的Android崩溃

使用socketjava的Android崩溃,java,android,sockets,client,Java,Android,Sockets,Client,我试图创建一个连接到服务器的应用程序,以便在每次从服务器收到消息时发送通知。 我创建了一个简单的客户端,在服务器断开连接之前一直在读取收到的消息。它使用普通Java工作,但当我在android的按钮事件中放入相同的代码时,它崩溃了。 我认为这是安卓处理异常的方式造成的,但我不同意 代码 崩溃消息: --------- beginning of crash 06-29 08:36:24.620 4325-4325/com.example.nxf44628.notificationexten

我试图创建一个连接到服务器的应用程序,以便在每次从服务器收到消息时发送通知。 我创建了一个简单的客户端,在服务器断开连接之前一直在读取收到的消息。它使用普通Java工作,但当我在android的按钮事件中放入相同的代码时,它崩溃了。 我认为这是安卓处理异常的方式造成的,但我不同意

代码

崩溃消息:

    --------- beginning of crash
06-29 08:36:24.620 4325-4325/com.example.nxf44628.notificationextender E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.nxf44628.notificationextender, PID: 4325
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
        at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
        at libcore.io.IoBridge.connect(IoBridge.java:122)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
        at java.net.Socket.startupSocket(Socket.java:592)
        at java.net.Socket.tryAllAddresses(Socket.java:128)
        at java.net.Socket.<init>(Socket.java:178)
        at java.net.Socket.<init>(Socket.java:150)
        at com.example.nxf44628.notificationextender.MainActivity$1.onClick(MainActivity.java:76)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
使用

在您的androidManifest.xml中

这里有一个类似的链接


同时将按钮侦听器中的所有内容移动到一个线程或服务。

代码的问题是,它在主线程(又称UI线程)上创建了一个连接套接字,这是不允许的

相反,我们必须将网络呼叫包装在后台线程中,这样就不会对应用程序产生影响

你有几种方法可以做到这一点

使用处理程序。 异步任务 意向与后台服务 使用反应式编程和所有与之相关的伟大库。
是关于异步任务的一个基本示例

您的应用程序可能会崩溃,因为您正在执行长时间运行的操作,而没有生成单独的线程。除非你提供日志,否则什么都不能说。同时,您可以学习如何提供调试日志-通过哦,我不知道关于adb日志选项!伟大的Bingo android.os.NetworkOnMainThreadException-现在有多种方法可以解决这个问题。详细-选择最适合您要求的。已获得此权限
    --------- beginning of crash
06-29 08:36:24.620 4325-4325/com.example.nxf44628.notificationextender E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.nxf44628.notificationextender, PID: 4325
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
        at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
        at libcore.io.IoBridge.connect(IoBridge.java:122)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
        at java.net.Socket.startupSocket(Socket.java:592)
        at java.net.Socket.tryAllAddresses(Socket.java:128)
        at java.net.Socket.<init>(Socket.java:178)
        at java.net.Socket.<init>(Socket.java:150)
        at com.example.nxf44628.notificationextender.MainActivity$1.onClick(MainActivity.java:76)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)