Поток пользовательского интерфейса демона Android - PullRequest
2 голосов
/ 20 сентября 2011

Мне нужно создать пользовательский поток пользовательского интерфейса демона, который показывает диалог, если есть какие-либо обновления на сервере (чтобы упростить его, давайте предположим, что диалог должен отображаться каждые 1 минуту). У меня есть BaseActivity, которая является родительской для каждого действия в моем приложении. Диалог должен быть показан на любом из моих мероприятий. Также у меня есть свой собственный класс SSAApplication, который расширяет Application. Итак, я хочу, чтобы мой поток пользовательского интерфейса был статическим полем класса SSAApplication, и этот поток можно было запускать и останавливать с помощью приложения. Я думаю, что в моем случае должен использоваться Handler, но я не знаю как. Проблема в том, что я не могу понять, как я могу показать диалог из этой темы. Итак, кто-нибудь может помочь с моей проблемой?

1 Ответ

1 голос
/ 20 сентября 2011

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

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

Прежде чем фоновый поток начнет свою работу, передайте ему интерфейс обратного вызова:

public interface SomeListener {
    public void onSomethingDone(Object result);
}

Допустим, вы хотите запустить этот поток и уведомить его.вы возвращаетесь всякий раз, когда у него есть данные (в отличие от запроса данных каждый раз).Базовый (не отвлеченный, некрасивый) подход будет следующим:

/* In your Activity */

private Handler mHandler = new Handler();

public void startBackgroundWork() {
    new WorkingThread(new SomeListener() {
        public void onSomethingDone(Object result) {

            mHandler.post(new Runnable() {
                public void run() { showMyDialog(result); }
            }

        }    
    }).start();
}

И затем, конечно,

public class WorkingThread extends Thread {
    private SomeListener mListener;

    public WorkingThread(SomeListener listener) {
        mListener = listener;
    }

    public void run() {
        /* do some work */
        mListener.onSomethingDone(result);
    }
}

Таким образом, ваш поток вызывает функцию, которая обеспечивает диалогпоказывается из цепочки действий.

Однако могут возникнуть другие проблемы.Это не на 100% правильный способ борьбы с этим.См. Этот блог для получения дополнительной информации:

http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/

...