Android:远程服务的主线程是什么?服务中的网络运营

时间:2013-02-19 18:31:25

标签: android service network-programming

我对android中的服务(远程服务)中的主线程感兴趣。 我实现了2个线程的服务(一个用于从套接字读取,一个用于从同一个套接字向服务器发送数据)。当我想要开始连接时(我只从“读取”线程的内部开始,之后,如果它通过,设置特殊标志以通知“发送”线程,设置连接)我得到这样的错误:

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
                }

我不明白什么是主线程(在这种情况下)以及为什么有时只会出现这些错误? 如果我的问题是基本的,我道歉,但我无法找到(由我)理解答案。 我添加简单和糟糕的流量控制图表(我是业余的): enter image description here

此致 ARTIK

2 个答案:

答案 0 :(得分:2)

  

我不明白什么是主线程(在这种情况下)

每个进程都有所谓的主应用程序线程。在具有UI(活动)的进程中,主应用程序线程驱动UI。它也是用于生命周期方法的线程(例如,服务的onStartCommand())。

在您的情况下,您在主应用程序线程上,因为您在名为Handler的服务中使用了com.example.aaa.MyServiceHandler中有一个Service是奇怪的,恕我直言。

答案 1 :(得分:0)

您无法在主UI线程上打开网络连接。你需要转移到一个单独的线程。