我正在开发应用程序,其中我在读取和写入套接字之前检查端口的可用性。我正在使用以下代码来检查状态
private boolean isAvailable(String host, int port) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 1000);
isPortAvailable = socket.isConnected();
} catch (IOException e) {
isPortAvailable = false;
}
return isPortAvailable;
}
此后我在onClick()
if (isAvailable(ip, Integer.parseInt(portLVR))) {
startActivity(new Intent(getApplicationContext(),ActivityLivingRoom.class));
} else
Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();
但我的问题是如果我在主线程上检查这个状态,那么android会给我networkonMainThradException
所以我如何使用后台线程管理这个操作?
答案 0 :(得分:1)
试试这个
private class SocketCheckTask extends AsyncTask<String , Integer , Boolean> {
String classname="";
public SocketCheckTask (String classname) {
this.classname=classname;
}
@Override
protected Boolean doInBackground(String... params) {
return isAvailable(params[0], Integer.parseInt(params[1]);
}
@Override
protected void onPostExecute(Boolean isAvailable) {
if (isAvailable)) {
Class c=Class.forName("yourpackage"+classname);
startActivity(new Intent(getApplicationContext(),c));
} else
Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();
}
}
然后像这样发送
SocketCheckTask task=new SocketCheckTask ("ActivityLivingRoom");
task.execute(ipadress,port);
答案 1 :(得分:0)
像这样:
private class CheckAvailabilityTask extends AsyncTask<Void, Void, Boolean> {
String ip;
int port;
public CheckAvailabilityTask(String ip, int port) {
this.ip = ip;
this.port = port;
}
@Override
protected Boolean doInBackground(Void... params) {
return isAvailable(this.ip, this.port);
}
@Override
protected void onPostExecute(Boolean isAvailable) {
if (iisAvailable) {
startActivity(new Intent(getApplicationContext(),ActivityLivingRoom.class));
} else
Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();
}
}
在onClick()
事件中:
new CheckAvailabilityTask(IP, PORT).execute();
答案 2 :(得分:0)
我认为最好的解决方案是,在click事件上启动一个新线程,并将你的开始活动代码放在同一个线程中。
如果您正在使用Toast,则可以从该线程执行此操作,但如果您计划更新UI(如红色/绿色状态),则必须使用处理程序和消息。
仅供参考,Asynctask只是删除了Thread的实现,并向人们展示了一个很好的抽象。
答案 3 :(得分:0)
您无法打开套接字并且永远不会关闭它以确定host:port是否可用。
测试任何服务或资源是否可用的唯一真正方法是尝试使用它。
只需在需要时执行连接和I / O,并在此时处理生成的异常。无论如何你必须抓住它们。
不要编写试图预测未来的代码。