Android 4.0 Socket问题

时间:2012-05-10 08:45:29

标签: android

嗯,Android 4.0不允许在UI线程上进行网络连接。 所以我开了一个新的主题。

public class NetThread extends Thread {
    BukkitController bc;
    Socket sock;
    ObjectOutputStream outstream;
    ObjectInputStream instream;
    boolean loaded=false;
    String ServerIP="192.168.123.103";
    String id="ssw";
    String pw="ssw";
    ArrayList<String> plist=new ArrayList<String>();
public void run(){
    try {
        sock=new Socket(ServerIP,3560);
        outstream=new ObjectOutputStream(sock.getOutputStream());
        instream=new ObjectInputStream(sock.getInputStream());
        //LOGIN
        outstream.writeObject("SIGN "+id+" "+pw);
    } catch (Exception e){}
        Object tmp;
        try{
        outstream.writeObject("PLIST");
        plist=(ArrayList<String>) instream.readObject();
        } catch ( Exception e){
        }


    loaded=true;
    while(true){}
}
public void Write(String msg){
    try {
        outstream.writeObject(msg);
    } catch ( Exception e){
    }
}

}

在UI线程中,我创建了对象:

m_nt=new NetThread();
m_nt.start();

使用LogCat测试后,我发现源位于:

sock=new Socket(ServerIP,3560);

我该如何解决这个问题? 我没有错,只是在那里冻结。

3 个答案:

答案 0 :(得分:0)

您无法在Honeycombe上的UI线程上执行网络IO。从技术上讲,它可以在早期版本的Android上运行,但这是一个非常糟糕的主意,因为它会导致您的应用停止响应,并可能导致操作系统因为表现不佳而导致您的应用被杀。您需要运行后台进程或使用AsyncTask在后台线程上执行网络事务。

在Android开发者网站上有一篇关于a link无痛线程的文章,这是对此的一个很好的介绍,并且将为您提供比这里实际提供的更好的答案深度。

答案 1 :(得分:0)

使用此:

try{
sock=new Socket(InetAddress.getByName(ServerIP),3560);
//more here
}
catch {Exception e}
{
Log.e("MyThread", "Error " + e.getMessage());
e.printStackTrace();
}

答案 2 :(得分:0)

我建议使用Asynctask来处理网络代码。 虽然我不得不承认你的代码停止了很奇怪。 如果服务器不可用,您应该获得例外。

有关AsyncTasks的一些其他信息,请检查Android developer