1

入力ストリームからデータを読み込もうとしていますが、プログラムが X 時間データを受信しない場合は、試行を終了して-1. 以前は使用してThread.sleep( X )いましたが、それは完全に間違ったアプローチであることに気付きました。誰かアイデアがあれば教えてください。入力ストリームから読み取るための私のコードは次のとおりです...

            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer, 0, length);

                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(MainMenu.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                // Start the service over to restart listening mode
                BluetoothService.this.start();
                //break;
            }
4

2 に答える 2

1

Futureを使用してこれを行うことができます。

まず、「将来の」値として返されるクラスが必要です。

public class ReadResult {
    public final int size;
    public final byte[] buffer;

    public ReadResult(int size, byte[] buffer) {
         this.size = size;
         this.buffer = buffer;
    }
}

次に、executor サービスを使用し、次のように get(long timeout, TimeUnit unit)を使用する必要があります。

        ExecutorService service = Executors.newSingleThreadExecutor();
        Future<ReadResult> future = service.submit(new Callable<ReadResult>() {

            @Override
            public ReadResult call() throws Exception {
                bytes = mInStream.read(buffer, 0, length);
                return new ReadResult(bytes, buffer);
            }
        });

        ReadResult result = null;
        try {
            result = future.get(10, TimeUnit.SECONDS);
        } catch (InterruptedException e1) {
            // Thread was interrupted
            e1.printStackTrace();
        } catch (ExecutionException e1) {
            // Something bad happened during reading
            e1.printStackTrace();
        } catch (TimeoutException e1) {
            // read timeout
            e1.printStackTrace();
        }

        if (result != null) {
            // here you can use it
        }

そうすれば、あなたはあなたの目標を達成することができるでしょう。入力ストリームをコンストラクター引数として受け入れる Callable クラスをサブクラス化し、クラス変数を使用する方がよいことに注意してください。

于 2012-08-10T09:16:14.377 に答える
0

新しいスレッドを開始し、そこで x 時間待つことができます。アクティビティへの参照を渡し、時間が終了したら、タイム スレッドからアクティビティのメソッドを呼び出すことができます。

例えば。

Thread time = new Thread() {

Activity foo;

public addActivity(Activity foo) {
this.foo = foo;
}

public void run() {
Thread.sleep(x);
// Once done call method in activity
foo.theTimeHasCome();
}

}.start();

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

于 2012-08-09T16:41:23.563 に答える