2016-07-06 4 views
0

こんにちは私は5〜10秒ごとに近いBluetoothデバイスを検索しようとしていますので、無限ループを試みましたが、ループを開始ボタン:Androidは無限ループに入っていきます

int stopInt=2; 
serachB.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        do { 
         final Handler handler = new Handler(); 
         handler.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           listAdapter.clear(); 
           getPairedDevices(); 
           startDiscovery(); 

          } 
         }, 4000); 

        } while (stopInt>1); 
       } 
+1

あなたは「アプリが立ち往生さ」とは何を意味するのですか?と同様に、無限ループ?何をしようとしているかのように聞こえます – CubeJockey

+3

stopInt変数をある場所で減らす必要があります。それが無限ループに終わるまで、 – Shriram

+0

CubeJockey-それは凍りついてしばらくしてから終了しました。Shriram-私は例を教えてください。理解できませんでした。 – Admond

答えて

0

変更もこの方法:

serachB.setOnClickListener(
    new Button.OnClickListener() { 
     public void onClick(View v) { 
      final Handler handler = new Handler(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        while(true){ 
         listAdapter.clear(); 
         getPairedDevices(); 
         startDiscovery(); 
         Thread.sleep(4000); 
        } 
       } 
      }); 
     }} 
+0

いいえ、いいえ、ありません!スピンウェイトは反パターンです!いくつかのスケジューリング手法を使用する – Fildor

+0

@Fildorもちろんあなたは正しい。ちょうど4秒ごとにこのようなヘビーウェイト手順を実行しないようにしてください(これは私が12秒間の正しい検出を覚えていればそれでは) – user6547359

+0

それも正しいです。しかし、それはスピンウェイトが良いと示唆されません;) – Fildor

0

は、あなたが継続的にメモリを食べに行くされて、あなたのwhileループ内Handlerの新しいインスタンスを作成しています。あなたが終了を引き起こしているOutOfMemoryErrorを取得していた場合、私は驚くことはありません。ループ外で単一のインスタンスを作成してみてください。

Handlerに渡されたRunnableは、そのスレッドで作成されたため、UIThreadで実行されます。これは長時間の操作では避け、別のスレッドに委譲してください。新しいハンドラを作成すると、それはそれをむしろあなたが潜在的にそれを入れ替えることができHandlerクラスを使用するよりも

を、作成されたスレッドのスレッド/メッセージ キューにバインドされている

ScheduledThreadPoolExecutorを使用すると、スレッドのプールが得られます。スレッドのプールは、デバイス検出コードを定期的に実行します。

まずScheduledExecutorServiceを作成します。

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); 

あなたRunnableのインスタンスを作成します。

MyRunnable deviceDiscovery = new MyRunnable(); 

次にあなたがscheduleAtFixedRateでキックオフあなたのonClick方法で:次に

ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(deviceDiscovery, 0, 1, TimeUnit.MINUTES); 

あなたはそれを停止するrunni NGあなたはScheduledFuturecancelを呼び出す必要があります:

future.cancel(true); // Set to true to say it can interrupt if already running 
1
private final Handler mMyhandler = new Handler(); 

private final Runnable checkBluetoothRunnable = new Runnable() { 
    public void run() { 

     //Do your work here 

     mMyHandler.postDelayed(this, 5000); 
    } 

}; 

serachB.setOnClickListener(
    new Button.OnClickListener() { 
     public void onClick(View v){ 
      mMyhandler.post(checkBluetoothRunnable); 
     } 
    } 
} 
関連する問題