#android
#Android
Вопрос:
Я использую метод handler.postDelayed, чтобы создать некоторую задержку для некоторых анимационных материалов.
При этом я также проигрываю какую-то песню с помощью Mediaplayer. Пользователь может выйти из этого класса действий, нажав далее. Но на следующем экране та же песня продолжается, хотя я вызвал метод stop в onclicklistener следующей кнопки.
Связано ли это с добавленным временем задержки, которое выполняется после загрузки следующего действия. Есть идеи?
handler.postDelayed(new Runnable() {
public void run() {
mp = MediaPlayer.create(getApplicationContext(), R.raw.num2);
mp.start();
imageView1.setImageResource(R.drawable.countcat2);
}
}, 2000);
Ответ №1:
Вы добавили, Log
чтобы посмотреть, будет ли run()
вызван? Я бы предположил, что ваш обработчик становится незарегистрированным; в конце концов, postDelayed
будет ждать, пока циклизатор снова не запустится.
Я предполагаю, что ваша анимация быстрее, чем эти 2000 мс? Вы все равно не сможете вызвать свой обработчик после того, как ваша активность прекратится, это доступ, imageView1
который, я полагаю, уничтожен в onDestroy
.
Вы могли бы рассмотреть возможность добавления флага, который принудительно вызовет операцию немедленно в onDestroy
, и / или вы могли бы использовать Timer
. В случае таймера убедитесь, что не используете что-то вроде imageView1
после того, как он был уничтожен.
Комментарии:
1. ого! флаг был таким простым. Я смущен. Спасибо 🙂
Ответ №2:
Используйте потоки. А затем остановите его прерыванием:
Public Thread getThread(final Handler handle, int delay)
{
return new Thread()
{
@Override
public void run()
{
try
{
synchronized(this)
{
Thread.sleep(delay);
handle.post(new Runnable()
{
@Override
public void run()
{
"the code to be exec."
}
});
}
}
catch(Exception e)
{
e.printStackTrace();
}
};
};
}
Или вы можете использовать функцию postDelayed
Public Thread getThread(final Handler handle, int delay)
{
return new Thread()
{
@Override
public void run()
{
try
{
synchronized(this)
{
handle.postDelayed(new Runnable()
{
@Override
public void run()
{
"the code to be exec."
}
}, delay);
}
}
catch(Exception e)
{
e.printStackTrace();
}
};
};
}
вы обнаружите, что между этими двумя методами есть небольшая разница. Чтобы прервать его, сделайте что-то вроде этого:
Thread t = getThread(handle, delay);
t.start();
if(t != null)
{
if (t.isAlive())
{
t.interrupt();
}
}
Надеюсь, я помог.