1

AsyncTaskを使用してサーバーにメッセージを送信しています。このAsynTaskは、メインのアクティビティクラス とは異なるクラス(CommTask.java )で定義されています。使用されるソケット、weberknechtのwebsocketは、AsyncTaskのdoInBackgroundメソッドで作成され、CommTask.javaにパブリックメソッド(SendDataToServer)があります。これは、CommTask.javaクラスのインスタンスを介してメインアクティビティで使用されます。 。

CommTaskのパブリックメソッドを使用する前に、メインアクティビティでインスタンスを初期化します。

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)
4

5 に答える 5

3

置く

if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= 9) {
    try {
        // StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX);
           Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                        .getContextClassLoader());
           Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread.currentThread()
                        .getContextClassLoader());
           Field laxField = threadPolicyClass.getField("LAX");
           Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
                setThreadPolicyMethod.invoke(strictModeClass, laxField.get(null));
    } 
    catch (Exception e) { }
}

onStart()メソッドで(またはAsyncTaskを実行する前に)解決します!

[編集]その他の説明:

Googleのドキュメントから:

アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外。これは、HoneycombSDK以降を対象とするアプリケーションに対してのみスローされます。以前のSDKバージョンを対象とするアプリケーションは、メインのイベントループスレッドでネットワークを構築できますが、お勧めできません。

于 2013-03-12T13:29:56.540 に答える
1

何か案が?なぜこれが起こることができますか?

スタック トレースは、あなたが主張していることをしていないことを示しています。を使用していませんAsyncTask。代わりに、メソッドからクラスの静的メソッドをonClick()呼び出し、その静的メソッドがネットワーク I/O を実行します。はメイン アプリケーション スレッドで呼び出され、この作業にはバックグラウンド スレッドを使用しておらず、そのネットワーク I/O はメイン アプリケーション スレッドで実行されているためです。SendDataToServer()CommTaskonClick()AsyncTaskSendDataToServer()

于 2013-03-12T16:17:36.717 に答える
1

ここで私の答えを試してください、

https://stackoverflow.com/a/9104893/557179

あなたの問題は、ネットワーク リクエストがメイン スレッドで行われることです。

于 2013-03-12T13:30:39.203 に答える
0

あなたの問題ではないかもしれませんが、あなたは証明書を渡しますか?

http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html

AndroidでHTTPSの証明書を受け入れる

于 2013-03-12T13:04:24.130 に答える
0
"and I have a public method in the CommTask.java, that is used in 
the main activity through an instance from the class CommTask.java"

AsyncTask を間違って使用していることを私に示唆しています。正しい.execute方法で起動していますか?

これは、この件に関する合理的な記事です。さらにサポートが必要な場合はお知らせください。

于 2013-03-12T12:59:20.757 に答える