10

AndroidのBluetoothSocketからinputstream.read()関数にタイムアウトを実装することは可能ですか?

Thread.sleep()を使用してみましたが、これはアクティビティを一時停止するだけです。

- -アップデート - -

私は考えを持っていました、ここで2つのスレッドコードをここで読み取ります(t1&t2)。 t2)読み取​​り中に、入力ストリームが0x0Dとして他のスレッド(t1)に割り込む文字を検出した場合、ここに私の質問があります。誰かが私を助けることができますか?スレッドのinterrupt()メソッドを使用しなかったので、誰かが私を助けてくれることを願っています、ありがとう...

- -アップデート - -



        public void run(){
        while(true){
            try {
            char r;
            String respuesta = "";
            while (true) {
                    r = (char) mmInStream.read();
                respuesta += r;
                if (r == 0x3e) {
                break;
                    }
                }
            respuesta = respuesta.replaceAll(" ", "");
            Log.d("respuesta", respuesta);
            rHandler.obtainMessage(MESSAGE_READ, -1, -1, respuesta).sendToTarget();
            } catch (IOException readException) {
            Log.e("ServicioGeneral", "Error de lectura", readException);
            this.interrupt();
            connectionLost();
            // posibly break();
            }
        }
    }

これは、何かが別のスレッドに入ったときの私の実装です。問題は、de mmInStreamから0x3e文字を取得しないと、タイムアウトに達することです。

2番目の例では、notifyAll()を使用する必要があると思いましたが、readThread()をいつ開始する必要がありますか?

ありがとう、@ weeman

4

2 に答える 2

10

次のようなことができます。

InputStream in = someBluetoothSocket.getInputStream();
int timeout = 0;
int maxTimeout = 8; // leads to a timeout of 2 seconds
int available = 0;

while((available = in.available()) == 0 && timeout < maxTimeout) {
    timeout++;
    // throws interrupted exception
    Thread.sleep(250);
}

byte[] read = new byte[available];
in.read(read);

このようにして、特定のタイムアウトでストリームから最初に読み取ることができます。読み取り中にいつでもタイムアウトを実装したい場合は、次のようなことを試すことができます。

Thread readThread = new ReadThread(); // being a thread you use to read from an InputStream
try {
   synchronized (readThread) {
      // edit: start readThread here
      readThread.start();
      readThread.wait(timeOutInMilliSeconds);
   }
catch (InterruptedException e) {}

これを使用すると、スレッドが実際に入力ストリームから何かを読み取った場合にアプリケーションに通知するために、ある種のイベント ハンドラーが必要になる場合があります。

それが役立つことを願っています!

- - 編集:

ハンドラーを使用せずに例を実装しました。

Socket s = new Socket("localhost", 8080);
    final InputStream in = s.getInputStream();

    Thread readThread = new Thread(new Runnable() {
        public void run() {
            int read = 0;
            try {
                while((read = in.read()) >= 0) {
                    System.out.println(new String(new byte[]{ (byte) read }));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

    synchronized (readThread) {
        readThread.start();
        try {
            readThread.wait(2000);

            if(readThread.isAlive()) {
                                    // probably really not good practice!
                in.close();
                System.out.println("Timeout exceeded!");
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
于 2012-05-11T23:24:55.733 に答える