下面是更新从异步线程的UI元素的正确方法:
public class SampleActivity extends Activity {
private TextView hourText;
private TextView minuteText;
private void updateHourText(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
hourText.setText(text);
}
});
}
private void updateMinuteText(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
minuteText.setText(text);
}
});
}
private class ClockTask extends AsyncTask
{
private int hourHand;
private int minuteHand;
public ClockTask(int hourHand, int minuteHand) {
this.hourHand = hourHand;
this.minuteHand = minuteHand;
}
@Override
protected Void doInBackground(Void... voids) {
try {
while(minuteHand != 0 || hourHand != 12){
if (hourHand != 12){
hourHand++;
updateHourText(Integer.toString(hourHand));
Thread.sleep(250);
}
if (minuteHand != 0) {
minuteHand += 5;
minuteHand %= 60;
updateMinuteText(Integer.toString(minuteHand));
Thread.sleep(250);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
}
new ClockTask(hourHand, minuteHand).execute();
正如你所看到的,为了更新TextView的文本,一个辅助方法neede:
,然后从按钮的onClickListener()调用此d,它会在你的主线程中始终执行TextView.setText()。这样,您的业务逻辑就可以在其自己的线程内执行(不会导致主线程等待,这会导致UI无响应),同时更新您的异步版本TextView。
此外,您不应该尝试更新主线程上下文之外的UI元素,因为这会导致引发异常。