2016-10-04 4 views
1

У меня есть эта проблема. Я пытаюсь обновить мой TextView из другого потока, и это не позволяет мне.Android runOnUiThread не выполняется

Я пробовал кучу различных решений, и ни один из них, похоже, не помог. В моем цикле while все время печатается «Запуск нового цикла», но он не продолжается с 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

Я думаю, что вы должен использовать 'Handler' и, возможно,' postDelayed' вместо –

+0

. Для этого вам следует использовать AsyncTask. – JoxTraex

ответ

0

Вот быстро исправить, у вас есть бесконечный цикл, который работает быстрее, чем поток может иметь возможность (время), чтобы начать. Таким образом, даже при этом вы спите в своей ветке с инструкцией if, если нить никогда не начинается, то сон не влияет.

И ваш сон внутри нити не будет работать так. Вы хотите отложить свой бесконечный цикл while, поэтому вам нужно переместить сон из потока в цикле while.

Таким образом, можно по-прежнему задерживать поток, добавляя в него дополнительный сон, но все зависит от того, чего вы хотите достичь.

Ваш окончательный код будет выглядеть следующим образом:

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 имеет предложить.

Мой глаз видел еще одну проблему, которая не является частью вашего вопроса, но хорошо сказать. Я предполагаю, что вы хотите считать от 9 до 0, то, что в случае, вам нужно исправить следующую строку, удалив = иначе вы получите отсчеты до -1, так что ваш код строка будет выглядеть следующим образом:

if(rullaavaNumero > 0) {...