Android の質問: ビューにテキストを設定すると、いつビューが UI を更新しますか? これが私のケース1です:
for(int i=0;i< 2000; i++){
aTextView.setText("a"+i);
}
aTextView は、TextView から拡張された MyTextView です。onDraw を次のように上書きします。
public static int counterP = 0;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
counterP++;
Log.d("MYButton", "onDraw: " + counterP);
}
ログからわかるように、印刷された counterP は結果ではありません。ループでは、onDraw メソッドは 2 ~ 4 回だけ呼び出されます。
ケース2の別のテストを行いました:
boolean notInit = true;
List<String> cmdList = null;
long stSelfRefresh = 0;
String contentStr;
TextView selfTv;
public void onSelfRefreshTv(View v) {
if (cmdList == null || cmdList.isEmpty()) {
Log.e(TAG, "empty now, reset");
notInit = true;
}
if (notInit) {
cmdList = new ArrayList<String>();
for (int i = 0; i < 2000; i++) {
cmdList.add("a" + i);
}
stSelfRefresh = SystemClock.uptimeMillis();
notInit = false;
selfTv = (MyTextView) findViewById(R.id.mytv);
}
contentStr = cmdList.remove(0);
Log.d(TAG, "contentStr = " + contentStr);
selfTv.setText(contentStr);
if (!cmdList.isEmpty()) {
if (!mHandler.sendEmptyMessage(99)) {
Log.e(TAG, "SKIP my self");
}
} else {
Log.d(TAG, "Cost time: " + (SystemClock.uptimeMillis() - stSelfRefresh));
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 99:
onSelfRefreshTv(null);
break;
default:
break;
}
}
};
ケース 2 の結果は、counterP が結果として出力されることです。1-2000。
textView が毎回更新される理由がわかりませんか? これについて何か考えはありますか?
前もって感謝します。
** * ***ケース 3 を追加* ** * ** * ****
for(int i=0;i< 2000;i++){
contentStr = cmdList.remove(0);
mHandler.sendEmptyMessage(100);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 100:
selfTv.setText(contentStr);
break;
default:
break;
}
}
};
** * ***ケース 3 の終了* ** * ** * *** ケース 3 のテスト結果は、ケース 1 と同様です。