嗯,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);
我该如何解决这个问题? 我没有错,只是在那里冻结。
答案 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