2013-10-30 88 views
-3

我正在使用示例來了解Android中的套接字的使用。我對此很陌生,我正在用書來學習。 我真的不知道問題是什麼,因爲這個例子實際上是從本書複製的,除了IP,這是我的電腦。 Android應用程序不斷拋出此錯誤:ANDROID HELP!錯誤:android.os.NetworkOnMainThreadException

錯誤:android.os.NetworkOnMainThreadException

我張貼代碼:

因爲有些話是在西班牙,我會翻譯它們對你來說,以防萬一它使它更易於理解:

PUERTO - > port,ENTRADA - > input,SALIDA - > output,ENVIANDO - >發送,HOLA MUNDO - > hello world,RECIBIENDO - >接收,DATOS-- > data,CLIENTE - > client

ANDROID CLIENT

package com.jacho981.clienteecho; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class ClienteECHO extends Activity { 

    private TextView output; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_cliente_echo); 

     output = (TextView) findViewById(R.id.TextView01); 
     ejecutaCliente(); 
    } 

    private void ejecutaCliente() { 
     // String ip = "158.42.146.127"; 
     String ip = "192.168.1.3"; 
     int puerto = 7; 

     log(" socket " + ip + " " + puerto); 

     try { 
      Socket sk = new Socket(ip, puerto); 
      BufferedReader entrada = new BufferedReader(new InputStreamReader(
        sk.getInputStream())); 
      PrintWriter salida = new PrintWriter(new OutputStreamWriter(
        sk.getOutputStream()), true); 

      log("enviando..."); 

      salida.println("Hola Mundo"); 

      log("recibiendo..." + entrada.readLine()); 

      sk.close(); 
     } catch (Exception e) { 
      log("error: " + e.toString()); 
     } 

    } 

    private void log(String string) { 
     output.append(string + "\n"); 
    } 

} 

Java服務器

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServidorECHO { 

    public static void main(String args[]) { 
     try { 
      ServerSocket sk = new ServerSocket(7); 
      while (true) { 
       Socket cliente = sk.accept(); 
       BufferedReader entrada = new BufferedReader(
         new InputStreamReader(cliente.getInputStream())); 
       PrintWriter salida = new PrintWriter(new OutputStreamWriter(
         cliente.getOutputStream()), true); 
       String datos = entrada.readLine(); 
       salida.println(datos); 
       cliente.close(); 
      } 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
    } 
} 
+3

之前,你有感嘆號問,我想你退後一步,看看你的錯誤,「網絡上的主線程例外」。谷歌搜索這個錯誤會告訴你多個結果,幫助你修復它。您需要從主線程中取消網絡代碼。 – hexafraction

+0

http://stackoverflow.com/a/18678258/826657看到這個! –

+1

標題中的networkonmainthreadexception的任何問題的副本。 – njzk2

回答

1
android.os.NetworkOnMainThreadException 

你正在做的時間承擔主界面操作,可卡用戶,甚至掛UI,你需要一個AsyncTask在主線程中執行的網絡操作,

有關在Android蜂窩和應用上面AsyncTasks

http://developer.android.com/reference/android/os/AsyncTask.html

更多信息將與NetworkOnMainThreadException崩潰,但將在早期版本上工作。

從開發人員的參考

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

0

這是異常的人越來越Android中傑利貝恩說,「同樣的代碼在較低的版本,但不是在豆形軟糖」。

解決方法是,您必須將您的網絡操作從主線程移動到bachground線程。
AsyncTask是一個很好的解決方案。 這裏是一個不錯的toutorial上Android Background processing

相關問題