2016-10-04 8 views
1

この問題があります。私はTextViewを別のスレッドから更新しようとしています。Android runOnUiThreadが実行されていません

私はさまざまなソリューションを試してみましたが、どれも役に立たないようでした。私のwhileループのコードでは、常に "Started New Loop"という文字が印刷されていますが、それはそれ以降ではありません。runOnUiThread

他のスレッドからTextViewを更新する方法を教えてもらえますか?

//second thread 
protected void startKakkosThread() { 
    Thread t2 = new Thread() { 
     public void run() { 
      while (true) { 
       System.out.println("Started new loop"); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          if(rullaavaNumero >= 0) { 
           rullaavaNumero--; 
           System.out.println(rullaavaNumero); 
           pelaajanPisteetTeksi.setText("" + rullaavaNumero); 
           sleep(1000); 
          }else{ 
           rullaavaNumero = 9; 
           System.out.println(rullaavaNumero); 
           pelaajanPisteetTeksi.setText("" + rullaavaNumero); 
           sleep(1000); 
          } 
         }catch (InterruptedException e){ 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } 
     } 
    }; 
    t2.start(); 
} 
+1

私はあなたを思う:私はそれはあなたのコード行は次のようになりますので、そうでなければ、-1までカウントを取得する場合は、あなたが=を除去することによって、次の行を修正する必要があることを、あなたは9から0までカウントするとします代わりに 'Handler'とおそらく' postDelayed'を使うべきです –

+0

これにはAsyncTaskの使用を考慮する必要があります。 – JoxTraex

答えて

0

ここでは、スレッドが開始するチャンス(時間)よりも速く実行される無限ループがあります。だからこのようにしても、if文を使ってスレッドの側で眠ることができます。スレッドが起動しない場合、スリープは効果がありません。

スレッド内の睡眠は、このようには動作しません。無限ループwhileループを遅延させたいので、whileループのスレッドからsleepを移動させる必要があります。

これで余分なスリープを追加することでスレッドを遅延させることは可能ですが、達成したいことに依存します。

あなたの最終的なコードは次のようになります。

protected void startKakkosThread() { 
    Thread t2 = new Thread() { 
     public void run() { 
      while (true) { 
       System.out.println("Started new loop"); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if (rullaavaNumero >= 0) { 
          rullaavaNumero--; 
          System.out.println(rullaavaNumero); 
          pelaajanPisteetTeksi.setText("" + rullaavaNumero); 
          // no need for sleep here 
          // sleep(1000); 
         } else { 
          rullaavaNumero = 9; 
          System.out.println(rullaavaNumero); 
          pelaajanPisteetTeksi.setText("" + rullaavaNumero); 
          // no need for sleep here 
          // sleep(1000); 
         } 
        } 
       }); 

       // add this part 
       try { 
        sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    t2.start(); 
} 

私はそれをテストしており、それは動作しますが、あなたはまた、@cricketを示唆しているものを行くことができます。

私の目はあなたの質問の一部ではありませんが、別の問題を見ました。

if(rullaavaNumero > 0) {... 
関連する問題