Какой тип потоков для этого вида деятельности?
У меня есть действие, которое запускается фоновой службой, чтобы показать прокручиваемые сообщения, которые служба получает от сервера. Возможно иметь только одно прокручиваемое сообщение или набор нескольких для прокрутки, по одному за раз.
Мой вопрос заключается в том, каков идеальный способ управления циклической прокруткой нескольких сообщений и нескольких наборов нескольких сообщений? Я пробовал свой цикл цикла в рабочих потоках, AsyncTask и т. Д.
Детали:
Мое действие прокрутки получает сообщение (я), чтобы показать, как массив строк, доступных для доступа к нему из области службы. Например, служба запускает действие, чтобы прокрутить несколько сообщений, одно за другим:
- Мой сервис заполняется
MyService.messages[]
с сообщениями, чтобы показать, а затем начинаетсяMyScrollActivity
, MyScrollActivity
получает размерMyService.messages[]
, Если>1, начатьMyCyclerThread
(или AsyncTask и т. д. - не нашли лучшего способа!)MyCyclerThread
проходит черезMyService.messages[]
и устанавливаетMyScrollActivity
TextView сmessages[i]
и анимирует по экрану один раз, по одной итерации за раз (одно сообщение прокручивается, затем следующее и т. д. - в конце цикла оно начинается снова вi=0
и повторяет сообщения снова.- Шаг 3 повторяется до тех пор, пока служба не прекратит работу или покажет другую активность. Циклер-нить (или что-то еще - цикл) должен умереть в это время.
Я хочу, чтобы этот конкретный рабочий поток (который выполняет зацикливание) умирал и никогда не возвращался, когда его деятельность прекращается. Но по какой-то причине всякий раз, когда действие перезапускается (скажем, для отображения появляется новый пакет сообщений), старый цикл цикла / рабочий поток восстанавливается вместе с новым потоком для новых сообщений.
Я пытался добавить Thread.currentThread().interrupt()
к деятельности onPause
а также onDestroy
методы, и я вижу в своем журнале, что поток действительно прерывается. Но, как я уже сказал, он воскресает (даже с тем же идентификатором, что и раньше) и снова запускает цикл. Это означает, что сколько бы раз я не начал свою деятельность "X", я также получаю количество запущенных потоков "X-1".
Я играл с XML для единственного экземпляра Activity, различными флагами isThreadABCrunning и т. Д. Я даже пытался использовать AsyncTask для циклического цикла. У меня заканчиваются идеи.
Помогите, я новичок / средний в Android... Я знаю, достаточно, чтобы создать проблемы, по-видимому. Есть ли что-то, что я упускаю из потока или деятельности? Может быть, это что-то столь же простое, как по-другому относиться к моей деятельности?
Я был бы признателен за обзор в 30000 футов, и затем я могу предоставить примеры кода по мере необходимости (я прошел слишком много итераций, чтобы определить одну из них, чтобы опубликовать ее здесь сейчас), поэтому извините, если я приближаюсь к нарушению Лучшая практика поста.
Обновление: анимационный код
slide = new TranslateAnimation(dm.widthPixels, -params.width, 0, 0);
slide.setDuration(animDuration);
slide.setRepeatCount(repititions);
slide.setRepeatMode(Animation.RESTART);
slide.setInterpolator(new LinearInterpolator());
slide.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
msgIsScrolling = true;
}
@Override
public void onAnimationEnd(Animation animation) {
msgIsScrolling = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
//nothing to do
}
});
textView_message.startAnimation(slide);
1 ответ
Моя внутренняя реакция заключается в том, что "многопоточные" решения являются неправильным способом решения этой проблемы. Моя первая мысль:
- Измените свой дизайн так, чтобы действие просто запрашивало у службы "следующее" сообщение для отображения (действие не должно знать о том, сколько сообщений или в каком индексе сообщений оно включено, оно должно просто показывать любое сообщение, которое ему отправляет служба).
- Используйте
Animator.AnimatorListener
"sonAnimationEnd()
способ повторно запустить вашу анимацию.
По сути, у вас есть какой-то метод внутри действия, который принимает сообщение и запускает его анимацию. Вы вызываете этот метод как при первом показе своей активности, так и при прокрутке сообщения.
Поскольку все это находится внутри самой деятельности, не должно быть никакой очистки, когда активность умирает.