2013-11-01 71 views
0

我使用它和StackoverFlow,但没有太多可用的信息。new Thread(new Runnable))start()会导致NetworkOnMainThreadException

而大多数答案建议使用线程,不要在主线程中打开套接字。

反正我这样的代码

public class Client implements Runnable { 
private Socket socket; 

private static ObjectOutputStream oos; 

public Client() { 
    mPauseLock = new Object(); 
    mPaused = false; 
    mFinished = false; 
    try { 
     socket = new Socket("168.131.148.50", 5001); 
     pw = new PrintWriter(socket.getOutputStream(), true); 
     oos = new ObjectOutputStream(socket.getOutputStream()); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void run() { 

     for (int i = 0; i < MsgQueue.getSize(); i++) { 
      try { 
       oos.writeObject(MsgQueue.get(i)); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
} 
} 

MainActivity new Thread(new Client()).start();

但我仍得到NetworkOnMainThreadExcpetion ..

可有人告诉我的解决方案吗?

回答

1

调用线的时候你是做在主线程socket()调用的“新客户端()”,你应该将所有之前向右移动在构造函数初始化代码相关的run方法里面的套接字创建的代码,你必须知道,只有“跑”的方法在后台线程中执行,而不是类的初始化:

public class Client implements Runnable { 
private Socket socket; 

private static ObjectOutputStream oos; 

public Client() { 
    mPauseLock = new Object(); 
    mPaused = false; 
    mFinished = false; 
} 

public void run() { 
    try { 
     socket = new Socket("168.131.148.50", 5001); 
     pw = new PrintWriter(socket.getOutputStream(), true); 
     oos = new ObjectOutputStream(socket.getOutputStream()); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    for (int i = 0; i < MsgQueue.getSize(); i++) { 
     try { 
      oos.writeObject(MsgQueue.get(i)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

}

你应该多看关于跳转到Android之前的Java ...

问候!

相关问题