Обновите интерфейс с динамическим текстом - PullRequest
2 голосов
/ 02 марта 2012

Я хочу обновлять текст на экране каждые 5 секунд, я создал таймер для этого. Однако после первого обновления он никогда не обновляет окно снова. Я предполагаю, что мне нужно обновить представление или что-то еще, но теперь я уверен, как, какие-либо идеи?

public class HomeActivity extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textTitle = (TextView) findViewById(R.id.textTitle);
        textArtist = (TextView) findViewById(R.id.textArtist);
        timedMeta();
}
static void timedMeta()
{
    timer.scheduleAtFixedRate(   
        new TimerTask() {
            public void run() {
                try{      
                    textTitle.setText(title);
                    textArtist.setText(artist); 
                    }
                Thread.sleep(UPDATE_INTERVAL);
                catch (Exception e) 
                { 
                },
                DELAY_INTERVAL,
                UPDATE_INTERVAL);
           }
       }
   )
}

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Я бы использовал Обработчик.

private static final int WHAT = 1;
private static final int TIME_TO_WAIT = 5000;

Handler regularHandler = new Handler(new Handler.Callback() {
    public boolean handleMessage(Message msg) {
        // Do stuff

        regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT);

        return true;
    }
});

regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT);

В качестве примера, это будет "Делать вещи" каждые 5000 миллисекунд.Вы можете заставить обработчик реагировать на разные события, передавая WHAT как другое целое число и обрабатывая его в функции handleMessage.

Редактировать: я бы обычно помещал константы и обработчик в класс в качестве членов, а обычный Handler.sendEmptyMessageDelayed (...) в onResume () {}

Я бы также добавил это в onPause () {}

regularHandler.removeMessages(WHAT)

Edit2: Пример:

public class HomeActivity extends Activity implements OnClickListener {
    private static final int WHAT = 1;
    private static final int TIME_TO_WAIT = 5000;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textTitle = (TextView) findViewById(R.id.textTitle);
        textArtist = (TextView) findViewById(R.id.textArtist);
    }

    @Override
    public void onResume() {
        super.onResume();
        regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT);
    }

    @Override
    public void onPause() {
        super.onPause();
        regularHandler.removeMessages(WHAT);
    }

    Handler regularHandler = new Handler(new Handler.Callback() {
        public boolean handleMessage(Message msg) {
            // Do stuff

            regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT);

             return true;
        }
    });
}

Вам нужно сделать это в onResume () и onPause (), потому что если вы не включите его в onPause, обработчик продолжит цикл, пока ваша активность не будет на переднем плане.Вам нужно будет снова включить цикл, когда он вернется на передний план (следовательно, onResume ()).

2 голосов
/ 05 марта 2012
runOnUiThread(new Runnable() {  
    public void run() {
        textTitle.setText(title);
    }
});

Вы не можете обновить пользовательский интерфейс из фонового потока.Всякий раз, когда вы хотите внести изменения в пользовательский интерфейс, рекомендуется использовать поток пользовательского интерфейса

2 голосов
/ 03 марта 2012

Использование обработчика - хорошая стратегия, но вам не нужен специальный обратный вызов.Вместо этого вы можете просто использовать postDelayed с Runnable.См. Этот Android документ для получения подробной информации о реализации.

...