我正在尝试在 android 中创建显示剩余时间(秒)的 textview。
为此使用了 runOnUiThread 和 Hadnler,一切似乎都运行良好(sysout 和调试显示两个线程都已执行并且值已正确更新)。但是,在 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);
}
});
}
}
});
经历了该领域的许多先前问题,但似乎没有一个针对此问题的具体解决方案。
提前致谢。
解决方案:
最后,我使用了 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
}
}