лучший способ обновить пользовательский поток в Android - PullRequest
1 голос
/ 26 марта 2012

У меня есть приложение, которое воспроизводит видео кадр за кадром. Это все работает. Однако, глядя на проблемы с производительностью и запустив трассировку, я заметил, что было много вызовов для отправки сообщений, это занимало много времени процессора.

Когда я посмотрел на свое приложение, я использую обработчик для отправки обратного вызова в пользовательский интерфейс для отображения текущего номера кадра. Когда я удалил это, все вызовы dispatchMessage в traceview пропали.

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

** ПРИМЕЧАНИЕ. Этот вызов выполняется примерно 30 раз в секунду.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012
// declaration
BrightTimer brt;
Handler mHandler;
Runnable mUpdateResults;

// onCreate
mHandler = new Handler();
mUpdateResults = new Runnable() {
    public void run() {
        //  set value to the widget you wish to update when the thread is running
    }
};
int delay = 0; // delay for 1 sec.
int period = 60000; // repeat every 1 sec.

Timer timer = new Timer();

brt = new BrightTimer();
timer.scheduleAtFixedRate(brt, delay, period);

// TimerClass
public class BrightTimer extends TimerTask
{
    @Override
    public void run() {
        mHandler.post(mUpdateResults);
    }
}
1 голос
/ 26 марта 2012

Я не совсем уверен в вашей реализации, но вы можете попробовать это. Если вы обновляете представление через свой обработчик, вы можете использовать это в самом представлении, чтобы обновить его из другого потока.

post (): http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

Другая вещь, которую вы можете попробовать, - это использовать runOnUIThread (), доступную в классе Activity.

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

Надеюсь, это поможет.

0 голосов
/ 03 апреля 2012

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

...