1

アンドロイドのサービス(リモートサービス)のメインスレッドに興味があります。2つのスレッド(1つはソケットからの読み取り用、もう1つは同じソケットからサーバーにデータを送信するため)でサービスを実装しました。接続を開始したい場合(「読み取り」スレッドの内部からのみ実行し、その後、通過した場合は、「送信」スレッドに接続が設定されたことを通知する特別なフラグを設定します)次のようなエラーが発生します。

02-19 18:12:46.318: E/AndroidRuntime(4945): FATAL EXCEPTION: main
02-19 18:12:46.318: E/AndroidRuntime(4945): android.os.NetworkOnMainThreadException
02-19 18:12:46.318: E/AndroidRuntime(4945):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.io.InputStreamReader.read(InputStreamReader.java:244)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.io.BufferedReader.readLine(BufferedReader.java:354)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at com.example.aaa.MyService.try_to_connect_with_server(MyService.java:640)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at com.example.aaa.MyService.URUCHOM_SIEC(MyService.java:510)
02-19 18:12:46.318: E/AndroidRuntime(4945):    at com.example.aaa.MyService$Handler_X.handleMessage(MyService.java:219)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at android.os.Looper.loop(Looper.java:137)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at android.app.ActivityThread.main(ActivityThread.java:5039)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.lang.reflect.Method.invokeNative(Native Method)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at java.lang.reflect.Method.invoke(Method.java:511)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-19 18:12:46.318: E/AndroidRuntime(4945):     at dalvik.system.NativeStart.main(Native Method)

以下のようなコードで(in.readlineの行):

            ...
            socket.connect(new InetSocketAddress(ADRES, 6000), 1200);
            if (socket != null) {
                in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(
                        socket.getOutputStream()));
                out.write("login_message\n");
                out.flush();
                response = in.readLine(); //<<<===== errors occur here
            ...


                          //setting flags about established connection
                }

(この状況で)メインスレッドとは何か、なぜこれらのエラーがたまにしか発生しないのかわかりません。私の質問が初歩的なものである場合はお詫びしますが、それに対する(私による)理解の答えを見つけることができませんでした。シンプルで見栄えの悪いフロー管理図を追加します(私はアマチュアです): ここに画像の説明を入力してください

よろしく、Artik

4

2 に答える 2

2

メインスレッドが何なのかわかりません(この状況で)

各プロセスには、メインアプリケーションスレッドと呼ばれるものがあります。UI(アクティビティ)を使用するプロセスでは、メインアプリケーションスレッドがUIを駆動します。これは、ライフサイクルメソッド(onStartCommand()サービスなど)に使用されるスレッドでもあります。

あなたの場合、Handlerサービスで、という名前のを使用したため、メインのアプリケーションスレッドを使用していますcom.example.aaa.MyService。にあるHandlerServiceは奇妙なことです、私見。

于 2013-02-19T18:35:36.130 に答える
0

メインUIスレッドでネットワーク接続を開くことはできません。別のスレッドに移動する必要があります。

于 2013-02-19T18:33:02.077 に答える