2016-09-24 17 views
0

残りの時間(秒)を表示するアンドロイドでテキストビューを作成しようとしています。runOnUiThreadが正しく動作しない

これにrunOnUiThreadとHadnlerを使用しましたが、すべてが正常に機能しているようです(sysoutとdebugは両方のスレッドが実行され、値が正しく更新されることを示しています)。 ただし、UIではtextview値が正しく更新されません。スレッドが完了すると、最後の値で更新されます。

私はフラグメントのプライベートメソッド内に以下のコードを書いています。

final TextView timerText =(TextView)mainView.findViewById(R.id.timerText); timerText.setText(R.string.maxAllowedSeconds);

handler.post(new Runnable() { 
     @Override 
     public void run() { 
      while(true) 
      { 
       System.out.println("Text:"+ ""+maxAllowedSeconds); 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       maxAllowedSeconds--; 
       if(maxAllowedSeconds <= 0) 
        break; 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         System.out.println("Running on UI Thread : " + maxAllowedSeconds); 
         timerText.setText("" + maxAllowedSeconds); 
        } 
       }); 
      } 
     } 
    }); 

この領域のこれまでの質問の多くは、この問題の具体的な解決策がないようです。

ありがとうございます。

SOLUTOIN:

最後に、私は予想通り完全に働いたAsynchTaskを使用しました。

private class RapidFireAsyncTimerTask extends AsyncTask<Integer, Integer, Void> { 

     private Context context; 
     private View rootView; 

     public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

      this.context = ctx; 
      this.rootView = rootView; 
     } 

     @Override 
     protected Void doInBackground(Integer... params) { 

      int maxSec= params[0]; 
      while (true) { 
       try { 
        TimeUnit.SECONDS.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       publishProgress(--maxSec); 
       if (maxSec <= 0) 
        break; 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final Integer... values) { 

      ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 

      //next task 
     } 
    } 

答えて

0

ハンドラの代わりに、AsynchTaskを使用しました(runOnUiThreadは必要ありません)。

public RapidFireAsyncTimerTask(Context ctx, View rootView) { 

     this.context = ctx; 
     this.rootView = rootView; 
    } 

    @Override 
    protected Void doInBackground(Integer... params) { 

     int maxSec= params[0]; 
     while (true) { 
      try { 
       TimeUnit.SECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      publishProgress(--maxSec); 
      if (maxSec <= 0) 
       break; 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 

     ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     //next task 
    } 
}