runOnUiThread不能正常工作
问题描述:
我想在android中创建显示剩余时间(秒)的textview。runOnUiThread不能正常工作
已经使用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);
}
});
}
}
});
通过了这方面的许多以前的问题,但没有一个似乎有这个问题的具体解决方案。
在此先感谢。
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
}
}
答
代替Handler,它与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
}
}