【发布时间】:2013-03-12 12:54:16
【问题描述】:
我正在使用 AsyncTask 向服务器发送一些消息。这个 AsynTask 定义在与主活动类不同的类 (CommTask.java) 中。 使用的套接字,来自 weberknecht 的 websocket,在 AsyncTask 的 doInBackground 方法中创建,我在 CommTask.java 中有一个 公共方法(SendDataToServer) ,即通过 CommTask.java 类中的实例在主要活动中使用。
在使用 CommTask 的公共方法之前,我在 main Activity 中初始化了实例:
commTask = new CommTask(serverIpAddress, socket, textStatus);
commTask.execute();
当我有数据要发送时,我会调用:
commTask.SendDataToServer(...);
当它用于主活动时,来自 CommTask.java 的公共方法和套接字使用 http 协议
socket = new SocketIO("http://"+this.serverIpAddress+":3000/");
没有出现异常,但是当它使用 https 时
socket = new SocketIO("https://"+this.serverIpAddress+":3000/");
android.os.NetworkOnMainThreadException 出现。
有什么想法吗?为什么会发生这种情况?
如果您需要查看代码,请参阅:
https://github.com/Javi44/LocAALTOn/tree/WebSockets-Gottox/src/com/android/locaalton
编辑:
这里有完整的错误堆栈:
03-12 15:14:36.090: W/System.err(27088): android.os.NetworkOnMainThreadException
03-12 15:14:36.100: W/System.err(27088): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
03-12 15:14:36.100: W/System.err(27088): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:686)
03-12 15:14:36.100: W/System.err(27088): at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
03-12 15:14:36.100: W/System.err(27088): at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:85)
03-12 15:14:36.100: W/System.err(27088): at de.roderick.weberknecht.WebSocketConnection.send(WebSocketConnection.java:165)
03-12 15:14:36.100: W/System.err(27088): at io.socket.WebsocketTransport.send(WebsocketTransport.java:137)
03-12 15:14:36.100: W/System.err(27088): at io.socket.IOConnection.sendPlain(IOConnection.java:452)
03-12 15:14:36.100: W/System.err(27088): at io.socket.IOConnection.emit(IOConnection.java:825)
03-12 15:14:36.100: W/System.err(27088): at io.socket.SocketIO.emit(SocketIO.java:236)
03-12 15:14:36.100: W/System.err(27088): at com.android.locaalton.CommTask.SendDataToServer(CommTask.java:137)
03-12 15:14:36.105: W/System.err(27088): at com.android.locaalton.LocAALTOnActivity$2.onClick(LocAALTOnActivity.java:200)
03-12 15:14:36.105: W/System.err(27088): at android.view.View.performClick(View.java:4211)
03-12 15:14:36.105: W/System.err(27088): at android.view.View$PerformClick.run(View.java:17267)
03-12 15:14:36.105: W/System.err(27088): at android.os.Handler.handleCallback(Handler.java:615)
03-12 15:14:36.105: W/System.err(27088): at android.os.Handler.dispatchMessage(Handler.java:92)
03-12 15:14:36.105: W/System.err(27088): at android.os.Looper.loop(Looper.java:137)
03-12 15:14:36.105: W/System.err(27088): at android.app.ActivityThread.main(ActivityThread.java:4898)
03-12 15:14:36.105: W/System.err(27088): at java.lang.reflect.Method.invokeNative(Native Method)
03-12 15:14:36.105: W/System.err(27088): at java.lang.reflect.Method.invoke(Method.java:511)
03-12 15:14:36.105: W/System.err(27088): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
03-12 15:14:36.105: W/System.err(27088): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
03-12 15:14:36.105: W/System.err(27088): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
请发布包含您的异常的整个 Java 堆栈跟踪。
-
请阅读有关 AsyncTasks 的更多信息并查看一些在线示例。您需要使用 asynctask.execute() 运行 asynctask。您不能只调用任务中的函数并期望它们在后台运行。
-
您在 CommTask 中的公共方法是从主踏板上的主要活动中调用的。
-
我已经添加了堆栈和我如何使用 AsyncTask 的解释,我忘了告诉我之前调用了 execute()。
标签: android android-asynctask websocket