Обработчик - почему мой исполняемый файл не выполняется?

У меня есть runnable, который я хочу выполнять 4 раза в секунду. Вот мой исполняемый файл:

shoot = new Runnable() {
        @Override
        public void run() {
            //Add bullet
            parts.add(new Part(1, (int)(screenWidth*.01),
                    Part.TYPE_CIRCLE, (int)parts.get(activeShooter).center.x,
                    (int)parts.get(activeShooter).center.y));
            parts.get(parts.size()-1).x_vel = (int)(Math.cos(parts.get(activeShooter).rotation)*bulletSpeed);
            parts.get(parts.size()-1).y_vel = (int)(-Math.sin(parts.get(activeShooter).rotation)*bulletSpeed);
            activeShooter = (activeShooter == numShooters) ? 0 : activeShooter + 1;
            shooter.postDelayed(shoot, 250);
        }
    };

И вот моя первоначальная настройка обработчика:

private void startBullets(){
    Looper.prepare();
    shooter = new Handler();
    shooter.postDelayed(shoot, 250);
}

Во всех моих других проектах мне не нужно было вызывать Looper.prepare, но если я этого не сделаю в этом проекте, он выдает исключение. Я не знаю почему. Я в основном скопировал рабочий код из другого проекта (который не требовал от меня вызова Looper.prepare()). Кто-нибудь может понять, почему мой runnable не выполняется?


person sadelbrid    schedule 31.07.2015    source источник


Ответы (1)


private void startBullets(){
    shooter = new Handler();
    shooter.postDelayed(shoot, 250);
}

Не забудьте выйти из Looper через Looper.quit(), когда закончите.

person Gennadii Saprykin    schedule 31.07.2015
comment
Это, казалось, прервало мой основной таймер, потому что, когда я добавил Looper.loop(), программа перестала обновляться. (обычно обновляется 60 раз в секунду) - person sadelbrid; 01.08.2015
comment
Можете ли вы показать, как вы используете метод startBullets? это фоновая тема? - person Gennadii Saprykin; 01.08.2015
comment
if(!readyToShoot){ /*random stuff*/ } else { startBullets(); } } Я полагаю, что эта задача выполняется в основном потоке. Я не очень хорошо знаком с потоками, но поток моей программы таков: отображается заставка, затем я использую намерение войти в свой класс InGame, который содержит объект класса, у которого у меня проблемы с обработчиком/исполняемым. Показанная строка находится в методе, который вызывается примерно 60 раз в секунду через таймер, запланированный в моем классе InGame. - person sadelbrid; 01.08.2015
comment
на потоке пользовательского интерфейса вам вообще не нужно готовить Looper, он уже есть. Просто создайте обработчик пользовательского интерфейса и используйте его. Я обновил свой ответ. - person Gennadii Saprykin; 02.08.2015