Для всех представлений уже настроен обработчик, поэтому создавать еще один неэффективно. Вместо этого вы должны использовать методы post(Runnable action) или postDelayed(Runnable action, long delayMillis) класса View.
Что касается того, чего вы пытаетесь достичь, я предполагаю, что предоставленный вами код служит просто примером. Если бы вы действительно просто пытались обновить какой-то текст, я бы сказал, используйте TextView и вызовите для него setText. TextView позаботится о том, чтобы аннулировать себя, когда узнает, что его текст изменился.
Но вернемся к вашему вопросу. Многое зависит от скорости, с которой вы хотите обновить рендеринг вашей переменной count. В настоящее время вы будете работать в бесконечном цикле в потоке пользовательского интерфейса. Это, безусловно, вызовет проблемы, поскольку вы будете спамить очередь обработчиков/событий недействительными вызовами, в то же время предотвращая запуск чего-либо еще в потоке пользовательского интерфейса.
Вместо этого я бы предложил ввести настраиваемую временную задержку и способ остановить обновление представления.
Например, вы можете настроить так, чтобы ваше представление аннулировалось раз в 10 секунд, и счетчик обновлялся только тогда, когда ваше представление было прикреплено к окну (обратите внимание, что Runnable сам отвечает за то, следует ли запускать его снова на основе значение флага updateView):
public class ThreadView extends View {
private class UpdateViewRunnable implements Runnable {
public void run() {
count++;
invalidate();
if (updateView) {
postDelayed(this, DELAY_TIME_MILLIS);
}
}
}
private static final long DELAY_TIME_MILLIS = 100L;
private boolean updateView = false;
private UpdateViewRunnable updateViewRunnable = new UpdateViewRunnable();
private Paint paint = new Paint();
private int count;
public ThreadView(Context context) {
super(context);
init(context, null);
}
public ThreadView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
paint.setColor(Color.BLACK);
paint.setTextSize(80);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawText(count + "", 100, 100, paint);
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
updateView = true;
postDelayed(updateViewRunnable, DELAY_TIME_MILLIS);
}
@Override
public void onDetachedFromWindow() {
updateView = false;
super.onDetachedFromWindow();
}
}
person
Michael Krause
schedule
10.06.2015
onDraw
не вызывается внутри вашего потока. Вы только увеличиваете переменнуюcount
. Может быть, вы можете попробовать вызвать методdrawText
из вашегоRunnable
. - person Thyen Hong Guedes Chang   schedule 11.06.2015