1

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 と同様です。

4

1 に答える 1