2013-02-19 40 views
0

我对android中的服务(远程服务)中的主线程感兴趣。 我使用2个线程(一个用于从套接字读取,一个用于从同一个套接字向服务器发送数据)实现服务。当我想要开始连接时(我只从“读”线程的内部进行连接,如果它通过,设置特殊标志以通知“发送”线程该连接已设置)我得到这样的错误:Android:远程服务的主线程是什么?在服务中的网络操作

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

+0

而不是:(我使用内部线程内服务什么是给定的解决方案之一在建议的帖子。 – Artik 2013-02-19 19:28:50

回答

2

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

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

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

+0

Thank you。这个处理程序用于从使用MyService的活动中读取消息。对我来说很奇怪,它可能会执行错误,因为我无法在代码中发现直接影响这个处理程序的连接,我必须更深入地发现与hadler的这种相互作用,再次感谢您。 – Artik 2013-02-19 18:49:53

+0

@Artik:“该处理程序适用于从使用MyService的活动中读取消息“ - 我不推荐这么做,请使用命令模式('startService()'a nd'onStartCommand()')或绑定模式(使用'Binder'绑定模式('bindService()'和'onBind()')。 – CommonsWare 2013-02-19 18:52:45

+0

是的,我使用它:我返回mMessenger.getBinder()onBind其中mMessenger是:\t最终Messenger mMessenger =新信使(new Handler_X()); Handler X是这个问题处理程序负责我的代码中的错误。这是对的吗?我为我的英语道歉(误解的来源)。 – Artik 2013-02-19 19:24:17

0

您不能打开的主UI线程的网络连接。你需要移动到一个单独的线程。

+0

谢谢。是的,我有单独的线程,我认为这里不是问题UI线程 - 它是在远程服务 - 没有用户界面(因为我很了解?) – Artik 2013-02-19 18:44:57

+0

用FlowDiagram解释你的服务如何工作的流程,以便我们看到问题出在哪里 – JoxTraex 2013-02-19 18:46:21