0

我正在开发应用程序,在该应用程序中,我在读取和写入套接字之前检查端口的可用性。我正在使用以下代码检查状态

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,那么我如何使用后台线程管理此操作?

4

4 回答 4

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);
于 2013-03-26T06:20:28.110 回答
0

您不能打开套接字,也不能仅仅为了确定主机:端口是否可用而关闭它。

测试任何服务或资源是否可用的唯一真正方法是尝试使用它。

只需在需要时进行连接和 I/O,并在此时处理产生的异常。无论如何,你必须抓住它们。

不要编写试图预测未来的代码。

于 2013-03-26T06:42:36.233 回答
0

我认为最好的解决方案是,在单击事件上启动一个新线程并将您的启动活动代码放在同一个线程中。

如果您使用 toast,您可以从该线程中执行此操作,但如果您计划更新 UI(如红色/绿色状态),则必须使用处理程序和消息。

仅供参考,Asynctask 只是删除了 Thread 的实现并向人们展示了一个很好的抽象。

于 2013-03-26T06:16:46.517 回答
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();
于 2013-03-26T05:52:56.877 回答