Создание уникальных postDelayed Runnables в цикле

Я эмулирую анимацию кадра; У меня все работает, есть одна проблема. У меня есть цикл for, в котором на каждой итерации он изменяет изображение ImageView после задержки.

for(int i = 1; i <13; i++){
            if (stop== false){
                String imgName = "b"+ Integer.toString(i);
                  id = getResources().getIdentifier(imgName, "drawable", getPackageName());
                Handler handlerTimer = new Handler();
                handlerTimer.postDelayed(new Runnable(){
                    public void run() {
                       view.setImageDrawable((getResources().getDrawable(id)));            
                  }}, 300);

            }
        }

Проблема в том, что run() не обновляется на каждой итерации; это работает только один раз.

Как я могу обновить или сделать новый запуск()?

Я открыт для любого другого способа сделать это.

Любой совет будет принят во внимание.


person Miles O'Keefe    schedule 05.07.2011    source источник


Ответы (2)


Шаг № 1: Определите Runnable как элемент данных вашей активности (или где бы ни находился этот код)

Шаг № 2: Сбросьте Handler, так как он вам не нужен — postDelayed() также реализован на View

Шаг № 3: Создайте вспомогательный метод, который выполняет вызов postDelayed() — здесь я буду называть этот метод foo() — и вызовите foo() там, где вы не должны вызывать postDelayed().

Шаг 4. В run() из Runnable снова позвоните в foo(), чтобы перенести Runnable на другой период задержки.

person CommonsWare    schedule 05.07.2011

Попробуйте это, если это не сработает, попробуйте что-нибудь еще:

for(int i = 1; i <13; i++)
{
    if (stop== false)
    {
        String imgName = "b"+ Integer.toString(i);
        id = getResources().getIdentifier(imgName, "drawable", getPackageName());
        Handler handlerTimer = new Handler();
        handlerTimer.postDelayed(new Runnable(){
            public void run() {
                view.setImageDrawable((getResources().getDrawable(id)));
                view.invalidate();            
                }}, 300);

    }
}

invalidate() должен привести к перерисовке вашего представления, и вы должны получить желаемый эффект. Надеюсь это поможет!

Это пример потока:

public class Main implements Runnable
{
    public Main()
    {
        Thread thread = new Thread(this);
        thread.start();
        //new Thread starts at run()
    }

    public void run()
    {
        String imgName = "b"+ Integer.toString(i);
        id = getResources().getIdentifier(imgName, "drawable", getPackageName());
        try
        {
            for(int i = 1; i <13&!stop; i++)
            {
                view.setImageDrawable((getResources().getDrawable(id)));
                Thread.sleep(300);
            }
        }catch(Exception e){e.printStackTrace();}
    }

    public static void main(String args[]){new Main();}
}

если вам нужно что-нибудь еще, просто дайте мне знать!

person gsfd    schedule 05.07.2011
comment
у меня не работает. Я попытался разместить view.invalidate(); вне пробега и там тоже не работало. - person Miles O'Keefe; 06.07.2011
comment
Вы пытались использовать поток вместо обработчика, который вы используете? Я могу привести пример, если он вам нужен. - person gsfd; 06.07.2011
comment
Да, не могли бы вы привести пример, пожалуйста? - person Miles O'Keefe; 07.07.2011