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

このような:

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 に答える
0

最良の解決策は、クリックイベントで新しいスレッドを開始し、開始アクティビティコードを同じスレッド内に配置することだと思います。

トーストを使用している場合は、そのスレッドから実行できますが、UI (赤/緑のステータスなど) を更新する場合は、ハンドラーとメッセージを使用する必要があります。

参考までに、Asynctask は Thread の実装を削除するだけで、人々に素晴らしい抽象化を示します。

于 2013-03-26T06:16:46.517 に答える
0

host:port が使用可能かどうかを確認するためだけに、ソケットを開いたり閉じたりすることはできません。

サービスまたはリソースが利用可能かどうかをテストする唯一の実際の方法は、それを使用してみることです。

必要なときに接続と I/O を実行し、その時点で結果の例外を処理します。とにかく捕まえなければなりません。

未来を予測しようとするコードを書かないでください。

于 2013-03-26T06:42:36.233 に答える