2013-02-19 21 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