SmerxDimas
@SmerxDimas
Начинающий разработчик на Java

Вопрос по потокам в Android?

У меня есть код:
public class MainActivity extends AppCompatActivity {
MyDraw draw;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        draw = new MyDraw(this);
        setContentView(draw);
        time t1 = new time();
        t1.start();
    }

    class time extends Thread implements Runnable{
        @Override
        public void run() {
            for (int i = 1; i < 10; i++)  {
                Log.d("MyTestTag", "Поток активен. Цикл начался");
                draw.invalidate();
            }
            }

}

public class MyDraw extends View {
    int cx = 0;
    int cy = 0;
    public MyDraw(Context context) {
        super(context);
    }

    public void onDraw(Canvas canvas){
     super.onDraw(canvas);
     canvas.drawColor(Color.BLUE);
        Paint paint=new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.WHITE);
        i += 10;
     canvas.drawCircle(cx,cy,50,paint);
        Log.d("MyTestTag" ,"Обновление внутри");
    }


}


Мы используем поток, в котором по циклу вызываем invalidate(); но по не понятным причинам в log выводится моё сообщение, что мы вызвали в цикле поток, но из OnDraw сообщение в логи об обновлении приходит единожды, хотя по идеи его должен invalidate в цикле вызывать 10 раз. Мы же вызвали в цикле invalidate() и он должен 10 раз запускать перерисовку, где мы меняем координаты и снова рисуем объект
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
@raxmatart
https://developer.android.com/reference/android/vi...

Логи приходят единожды потому что вью отрисовывается 1 раз при инициализации. Нельзя в андроид обращаться к вью не из главного потока. Банальное решение - использовать postInvalidate()
PS Если хочешь посмотреть что и как вызывается используй лучше дебаггер, а не логи)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Честно говоря, я не знаю точно, как работает графическая подсистема Android, но скорее всего так же, как GUI-библиотеки на PC. При запуске приложения с графическим интерфейсом, создаётся цикл событий и очередь событий. События от программы, от операционной системы и от пользователя поступают в очередь. На каждой итерации цикл событий извлекает их из очереди и передаёт соответствующим обработчикам. При этом обработчик перерисовки не будет на одной итерации цикла событий вызываться 10 раз, если в очереди 10 событий инвалидации. Это бессмысленно как с позиции логики работы графических интерфейсов, так и с позиции производительности.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы