0

У меня была настройка AlarmManager в моем классе MainActivity.AlarmManager - Я делаю это правильно?

Класс, который называется AlarmReceiver, запускается для каждого заданного интервала времени.

Мне нужно выполнить операцию, когда этот класс запущен. Этот код находится в в другом классе Parsing.java

Сейчас в AlarmReceiver.java, я делаю это:

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Parsing obj = new Parsing(context); 

     obj.execute(); 

    } 
} 

Я не могу писать код непосредственно в AlarmReceiver.java, потому что AlarmReceiver.java уже расширяет BroadcastReceiver и мой код Parsing.java распространяется на другой класс.

Итак, я создаю объект для класса Parsing и вызывая этот метод.

Является ли мой подход правильным?

В случае необходимости я предоставим дополнительную информацию. Пожалуйста, дайте мне знать, если мой подход правильный? Спасибо заранее!

EDIT:

Parsing.java

public class Parsing extends AsyncTask<Void, Void, Void> { 

//some code 

} 

ответ

1

Начиная AsyncTask из BroadcastReceiver неправильно по двум причинам:

1. нить, на которой onReceive() работает прекращается после того, как метод возвращает, эффективно заканчивая долго выполняющихся задач ВГ ich, возможно, началось оттуда. Цитируем официальный docs:

BroadcastReceiver объект действителен только для продолжительности вызова onReceive(Context, Intent). Как только ваш код вернется из этой функции , система считает объект завершенным и уже не активным .....все, что требует асинхронной работы, не является , потому что вам нужно будет вернуться из функции, чтобы обрабатывать асинхронную операцию , но в этот момент больше неактивен и, следовательно, система может убить свой процесс до асинхронная операция завершена.

2.Context экземпляр, который обеспечивает onReceive() не то же самое, как Context из Activity или Service, т.е. Activity.this или Service.this. Вам необходимо, чтобы это правильно Context для выполнения многих из общих полезных операций, которые мы обычно делаем с Activity или Service. Так, например, правильный способ начать Service в
onReceive() является:

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent i = new Intent(context.getApplicationContext(), ParsingService.class); 
    context.getApplicationContext().startService(i); 
} 

и не

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent i = new Intent(context, ParsingService.class); 
    context.startService(i); 
} 
+0

Perfecto! Но учитывая первую причину, о которой вы говорили, работает ли сервис, который мы начинаем с «onReceive()», заканчивается через некоторое время после того, как код возвращается из этой функции? – Nikhil

+1

Нет, «Сервис» - полностью независимый компонент, который не имеет никакого отношения к жизненному циклу вашего «BroadcastReceiver» ... поэтому вам не стоит беспокоиться об этом. «Сервис» может быть остановлен после завершения его работы. –

+0

Ницца! Спасибо! :) – Nikhil

1

Я не знаю, как вы написали свою Parsing.java, она выглядит хорошо, но помните, что это

Это метод всегда вызывается внутри основного потока его процесса, если только вы явно не попросили его запланировать в другом потоке используя registerReceiver. Когда он запускается в основном потоке, вы никогда не должны выполнять длительные операции в нем (есть время ожидания 10 секунд, которое система разрешает перед тем, как считать, что приемник заблокирован, и кандидата, которого нужно убить). Вы не можете запустить всплывающее диалоговое окно в вашей реализации OnReceive()

Для меня, я думаю, что это лучший способ справиться с этим звонит другой сервис внутри OnReceive метода, как этот

@Override 
    public void onReceive(Context context, Intent intent) { 
     Intent i = new Intent(context, ParsingService.class); 
     context.startService(i); 
    } 
+0

Начиная другой сервис, мы удаление этого времени ограничение? – Nikhil

+0

Пожалуйста, посмотрите мой отредактированный вопрос, я добавил класс Parsing.java. – Nikhil

Смежные вопросы