Помогите мне научиться правильно пользоваться Сервисами и Потоками - PullRequest
4 голосов
/ 24 мая 2011

Я прошу помощи, чтобы моя жизнь и, что более важно, жизни моего пользователя не испортились из-за того, что я не знал, как правильно использовать сервисы и потоки.

Я не прошу длинных объяснений, а большего подтверждения. Это хорошо, если я совершенно неправ. Я здесь, чтобы учиться.

Если я правильно понимаю: 1. служба работает в фоновом режиме (без пользовательского интерфейса). 2. служба теоретически будет работать вечно, пока не убьет себя (я полагаю, здесь большое предположение) 3. служба будет продолжать работать, даже если основная активность не видна (как насчет уничтожения?)

Итак, вот мой кодовый вопрос.

У меня есть настройки сервиса и поток. Все отлично работает, но работает только один раз. Мне нужно это зациклить и продолжать проверять. Как только это будет сделано, запустите run (), как мне сказать ему снова запустить ()?

public class NotifyService extends Service{

    private long mDoTask;

    NoteThread notethread;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        mDoTask = System.currentTimeMillis();
        notethread = new NoteThread();
        notethread.start(); 
    }


    public class NoteThread extends Thread {
        NotificationManager nManager;
        Notification myNote;

        @Override
        public synchronized void start() {
            super.start();
//init some stuff
        }

        @Override
        public void run() {
                    //If it's been x time since the last task, do it again
            //For testing set to every 15 seconds...
            if(mDoTask + 15000 < System.currentTimeMillis()){

//Take care of business
        mDoTask = System.currentTimeMillis();                   
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Из документов Android:

Служба - это компонент приложения, представляющий либо желание приложения выполнить более продолжительную операцию, не взаимодействуя с пользователем, либо предоставление функциональности для использования другими приложениями.,Каждый класс сервиса должен иметь соответствующее объявление в AndroidManifest.xml своего пакета.Службы можно запускать с помощью Context.startService () и Context.bindService ().

Обратите внимание, что службы, как и другие объекты приложений, выполняются в главном потоке своего процесса размещения.Это означает, что, если ваша служба будет выполнять какие-либо операции с интенсивным использованием ЦП (например, воспроизведение MP3) или блокировать (например, сетевые), она должна создать свой собственный поток, в котором будет выполняться эта работа.Более подробную информацию об этом можно найти в разделе «Процессы и потоки».Класс IntentService доступен как стандартная реализация Service, которая имеет собственный поток, в котором она планирует свою работу.

Подробное обсуждение создания служб можно найти в документе Services.

Другими словами, служба НЕ работает в фоновом режиме, если вы не поместили ее в поток.Если вы помещаете службу, которая никогда не заканчивается в вашем приложении, без ручного создания потока, тогда он WILL block.

Android предоставляет API для выполнения фоновых задач для вас без необходимости возиться сПотоки Java;он называется AsyncTask и это одно из немногих ХОРОШИХ дизайнерских решений, которые когда-либо принимала команда Android.

РЕДАКТИРОВАТЬ Я забыл ответить на ваш вопрос о многопоточности.Вы не хотите, чтобы поток выполнял свой метод run() более одного раза.Либо создайте новый поток, либо поместите цикл while вокруг содержимого логики run, которое вы хотели бы повторить.

0 голосов
/ 24 мая 2011

Чтобы лучше понять темы, прочитайте «Брайан Гетц» «Практика Java-параллелизма на практике».

Чтобы лучше понять службы, я думаю, что вы должны написать их как однопоточные и позволить контейнеру Java EE развертывать их для обработки проблем с потоками.Сервлет в пуле - лучшее решение, чем бремя управления потоками для пользователей в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...