2014-06-09 83 views
0

我非常新的Android應用程序的開發,我已經創建了我下面的活動的onCreate()以下:通過套接字連接到服務器的Android

public String test(){ 
    String test = ""; 
    try{ 
    Socket s = new Socket(InetAddress.getByName("ipaddress"), port#); 
    test +=(s.isConnected()); 

    BufferedReader readFromHost = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    readFromHost.ready(); 


    test += (readFromHost.readLine()); 
    s.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return test; 

} 

然後,這只是路線爲:

textView2.setText(test()); 

但是從服務器抓取的字符串「test_message」沒有出現在文本視圖中。然而,當我只是做

textView2.setText("hi"); 

它出現在視圖,或者如果我運行在Java測試()Android的程序之外產生的「test_message」出現在控制檯中。任何想法爲什麼它不會出現在android運行時?港口對待不同?任何幫助都會很棒。

附加的是LogCat。似乎有一個「NetworkOnMainThreadException」?

程序中出現的所有內容都是您單擊一個按鈕,該按鈕會用textview打開一個新的活動。

登錄:

06-09 12:13:18.189: W/ApplicationPackageManager(4768): getCSCPackageItemText() 
06-09 12:13:18.239: E/MoreInfoHPW_ViewGroup(4768): Parent view is not a TextView 
06-09 12:13:18.369: E/SpannableStringBuilder(4768): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
06-09 12:13:18.369: E/SpannableStringBuilder(4768): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
06-09 12:13:22.773: W/ApplicationPackageManager(4768): getCSCPackageItemText() 

06-09 12:13:22.783: W/System.err(4768): android.os.NetworkOnMainThreadException 
06-09 12:13:22.783: W/System.err(4768):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156) 
06-09 12:13:22.783: W/System.err(4768):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
06-09 12:13:22.783: W/System.err(4768):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
06-09 12:13:22.783: W/System.err(4768):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
06-09 12:13:22.783: W/System.err(4768):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
06-09 12:13:22.783: W/System.err(4768):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
06-09 12:13:22.783: W/System.err(4768):  at java.net.Socket.startupSocket(Socket.java:566) 
06-09 12:13:22.783: W/System.err(4768):  at java.net.Socket.<init>(Socket.java:226) 
06-09 12:13:22.783: W/System.err(4768):  at com.example.myfirstapp.DisplayMessageActivity.test(DisplayMessageActivity.java:42) 
06-09 12:13:22.783: W/System.err(4768):  at com.example.myfirstapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:31) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.Activity.performCreate(Activity.java:5426) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.ActivityThread.access$900(ActivityThread.java:161) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
06-09 12:13:22.783: W/System.err(4768):  at android.os.Handler.dispatchMessage(Handler.java:102) 
06-09 12:13:22.783: W/System.err(4768):  at android.os.Looper.loop(Looper.java:157) 
06-09 12:13:22.783: W/System.err(4768):  at android.app.ActivityThread.main(ActivityThread.java:5356) 
06-09 12:13:22.783: W/System.err(4768):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-09 12:13:22.783: W/System.err(4768):  at java.lang.reflect.Method.invoke(Method.java:515) 
06-09 12:13:22.783: W/System.err(4768):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
06-09 12:13:22.783: W/System.err(4768):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
06-09 12:13:22.783: W/System.err(4768):  at dalvik.system.NativeStart.main(Native Method) 
06-09 12:13:22.803: E/MoreInfoHPW_ViewGroup(4768): Parent view is not a TextView 
+1

logcat會說什麼嗎? – eleven

+2

@Foxinsocks「UI線程中的網絡操作」也許? – harism

+0

@harism添加完整日誌到您的問題。 – eleven

回答

1

你不能做的Main Thread網絡請求。創建您自己的Thread並從服務器獲取字符串:

private TextView textView2; 

public void test(){ 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      final StringBuilder test = new StringBuilder(); 
      try{ 
       Socket s = new Socket(InetAddress.getByName("ipaddress"), 1111); 
       test.append(s.isConnected()); 

       BufferedReader readFromHost = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       readFromHost.ready(); 


       test.append(readFromHost.readLine()); 
       s.close(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        textView2.setText(test.toString()); 
       } 
      }); 
     } 
    }).start(); 
} 
+0

有趣。所以它工作,我連接,但setText行引發空指針異常(和應用程序崩潰)。使用Log.i測試實際上確實具有適當的信息並且未設置爲空。 – DeeVu

+0

@DeeVu所以'textView2 == null'。 – eleven

+0

得到它的工作。非常感謝你的幫助。由於線程的性質和需要有最終變量,我的實現拋出了一些錯誤。通過讓行讀取'((TextView)findViewById(R.id.txtview))。setText(test.toString());' – DeeVu

相關問題