0

好吧,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);

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

4

3 回答 3

0

用这个:

try{
sock=new Socket(InetAddress.getByName(ServerIP),3560);
//more here
}
catch {Exception e}
{
Log.e("MyThread", "Error " + e.getMessage());
e.printStackTrace();
}
于 2012-05-10T08:54:13.130 回答
0

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

在 Android 开发者网站上有一篇关于Painless Threading链接的文章,它很好地介绍了这一点,并且将为您提供比此处实际提供的更深入的答案。

于 2012-05-10T08:51:13.150 回答
0

我建议使用 Asynctask 来处理您的网络代码。虽然我不得不承认你的代码只是停止很奇怪。如果服务器不可用,您应该得到一个异常。

有关 AsyncTasks 的更多信息,请查看Android 开发人员

于 2012-05-10T08:56:33.893 回答