残りの時間(秒)を表示するアンドロイドでテキストビューを作成しようとしています。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
}
}