Подтвердить что ты не робот

Как подключить службу?

Мой сервис должен проверять что-то каждую минуту и ​​

while(true)
{
   Thread.sleep(60000) 
   //REST OF CODE HERE//
}

не работает. Заблокировать приложение и попросить меня принудительно остановить его.

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

Любые предложения приветствуются.

ИЗМЕНИТЬ

Я исправил его, и в случае, если вам интересно, как выглядит код, как хорошо, вы идете:

@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast.makeText(this, "Service running", Toast.LENGTH_SHORT).show();

    handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            Toast.makeText(protectionService.this, "5 secs has passed", Toast.LENGTH_SHORT).show();
        }

    };



    new Thread(new Runnable(){
        public void run() {
        // TODO Auto-generated method stub
        while(true)
        {
           try {
            Thread.sleep(5000);
            handler.sendEmptyMessage(0);

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        }

                        }
    }).start();
}

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

Я хотел бы поблагодарить винеетскую, Януша и иназарука за предложение использовать Handlers. Я хотел бы поблагодарить всех, кто тоже ответил, ваша помощь была очень оценена.

4b9b3361

Ответ 1

создайте поток в своей службе и поставьте цикл while следующим образом:

 new Thread(new Runnable(){
    public void run() {
    // TODO Auto-generated method stub
    while(true)
    {
       Thread.sleep(60000) 
       //REST OF CODE HERE//
    }

                    }
}).start();

Ответ 2

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

В вашем случае, однако, вам следует вместо этого использовать AlarmManager. Он отлично справляется с повторяющимися событиями и был специально разработан для подобных сценариев.

Другим решением было бы использовать Handler и его функцию postDelayed(). Это можно использовать, когда ваша операция (которая должна выполняться каждые 60 секунд) не занимает много времени (или иначе вы все равно должны запускать ее в фоновом потоке).

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

Ответ 3

Служба сама по себе не является субтрестом. Это означает, что каждый код, который запускается в вашей службе, будет запускаться в основном потоке пользовательского интерфейса. Вам нужно запустить Thread или использовать AsyncTask в своей службе, чтобы переместить вычисление на задний план.

Обратитесь к документации для получения дополнительной информации.

Если вы хотите каждый раз повторять код, вы можете использовать handler.

У обработчика есть метод под названием postDelayed, который позволяет указать время, после которого будет запускаться runnable. Просто вызовите метод еще раз в конце вашей runnable, чтобы перезапустить код через минуту.

Ответ 4

Службы запускаются в основном потоке. Если вы хотите обработать разгрузку, вам нужно запустить отдельный поток. Посмотрите IntentService, он делает это по умолчанию. На другой ноте, имея бесконечно запущенную службу со сном(), может не быть хорошей идеей. Для запланированной обработки вы можете использовать AlarmManager.

Ответ 5

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

final Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // Do repeatable stuff
        handler.postDelayed(this, DELAYED_TIME);
    }
};
handler.post(runnable);

Он отправит runnable, а затем опубликует его снова и снова после DELAYED_TIME.