나머지 시간 (초)을 표시하는 android에서 textview를 만들려고합니다.runOnUiThread가 제대로 작동하지 않습니다.
runOnUiThread 및 Hadnler를 사용했는데 모든 것이 잘 작동하는 것 같습니다 (sysout 및 디버그는 두 스레드가 모두 실행되고 값이 적절히 업데이트되었음을 보여줍니다). 그러나 UI에서 textview 값이 제대로 업데이트되지 않습니다. 스레드가 완료되면 마지막 값으로 업데이트됩니다.
아래 코드를 개인적인 방법으로 작성했습니다.
최종 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
}
}