Android, не в состоянии использовать таймер - PullRequest
0 голосов
/ 22 августа 2011

Я хотел бы изменить фоновое изображение структуры кадра в секунду.Для этой задачи я использую классы timer и timertask, но, похоже, он не работает, поскольку исходный фон никогда не меняется, а тестовое устройство, которое я тестирую, следующий код некорректно завершает работу.

    FrameLayout fl;
List<Integer> myList;
int i = 0;
TimerTask myTimerTask = new TimerTask()
{
    public void run()
    {
        fl.setBackgroundResource(myList.get(i));
        i++;
    }
};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myList = new ArrayList<Integer>();
    myList.add(R.drawable.square1);
    myList.add(R.drawable.square2);
    myList.add(R.drawable.square3);
    myList.add(R.drawable.square4);
    myList.add(R.drawable.square5);
    myList.add(R.drawable.square6);
    myList.add(R.drawable.square7);
    myList.add(R.drawable.square8);
    myList.add(R.drawable.square9);
    myList.add(R.drawable.square10);
    myList.add(R.drawable.square11);
    myList.add(R.drawable.square12);



    fl = (FrameLayout)findViewById(R.id.frameLayout1);

    long delay = 1000;
    long period = 1000;

    Timer t = new Timer();
    t.schedule(myTimerTask,delay,period);


}

Где произойдет сбой?^^ Заранее спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 22 августа 2011

Вы должны позвонить invalidate() после установки нового фонового ресурса.

0 голосов
/ 22 августа 2011

Вы не можете получить доступ к представлению из потока, не являющегося пользовательским интерфейсом, как таймер. Вам нужно иметь обработчик , чтобы обновить представление и получить таймер для отправки ему сообщений. И вам нужно помешать мне выйти за пределы, как:

TimerTask myTimerTask = new TimerTask() {
    public void run() {
        Message m = Message.obtain();
        m.what = i;
        myUpdateHandler.sendMessage(m);
        i++;
        if (i >= myList.size())
            i = 0;
    }
};

.

Handler myUpdateHandler = new Handler() {
    /** Gets called on every message that is received */
    @Override
    public void handleMessage(Message msg) {
        fl.setBackgroundResource(myList.get(msg.what));

    }
};

.

0 голосов
/ 22 августа 2011

Ну, у вас есть несколько проблем в вашем коде. Из вашего кода не ясно, где инициализируется «fi», это перед вызовом таймера? после? Какова цель int "я"? Разве это не должен быть ученик? Вы должны остановить таймер в onDestroy для Activity, иначе вы можете получить нежелательное поведение при доступе к макету фрейма.

В любом случае, попробуйте запустить следующее из onCreate:

final FrameLayout fl = (FrameLayout)findViewById(R.id.frameLayout1); // You must have final here
final List<Integer> myList = <get it from where you need to>
int i = 0; // What is the purpose of this int? it passed by value to the callback - are you sure it is needed?
TimerTask myTimerTask = new TimerTask()
{
    public void run()
    {
        fl.setBackgroundResource(myList.get(i));
        i++; // Shouldn't it be a class member?
    }
};
...