У меня есть runnable, который я хочу выполнить 4 раза в секунду. Вот мой исполняемый:Обработчик - почему мой runnable не выполняется?
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 не выполняется?
Это, казалось, прерывало мой основной таймер, потому что когда я добавил Looper.loop(), программа перестала обновляться. (обычно обновляется 60 раз в секунду) – sadelbrid
вы можете показать, как вы используете метод startBullets? это фоновый поток? –
'if (! ReadyToShoot) { /* случайный материал */ } else { startBullets(); } } Эта задача выполняется в основном потоке, на который я верю. Я не очень хорошо знаком с потоками, но поток моей программы таков: всплывающие экраны экрана, затем я использую намерение ввести мой класс InGame - который содержит объект класса, с которым у меня возникают проблемы с обработчиком/runnable. Строка показана в методе, который вызывается примерно 60 раз в секунду через таймер, запланированный в моем классе InGame. – sadelbrid