Android-приложение не отвечает после запуска сервиса
Я хочу создать сервис Android, который будет проверять, есть ли новые элементы на моем сайте, используя json:), поэтому мой первый шаг - проверить, будет ли сервис хорошим:). Я создал свой сервис таким образом.
public class NotifyService extends Service {
public static boolean ServiceIsRun=false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int i = 1;
while (ServiceIsRun){
i++;
Log.i("broadService","hello from Service"+i);
try{
Thread.sleep(20000);
}catch (Exception e){
}
}
return START_STICKY;
}
}
и мой приемник:
public class NotifyBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
if (intent.getAction().equalsIgnoreCase("com.latestBabiaNews")){
Log.i("broadReceiver","hello from Broadcast");
}
}
}
PS: у меня есть Asynctask в моем Fragmenet, чтобы загрузить данные с сервера, и я назвал службу так (в onPostExecute ()
if(NotifyService.ServiceIsRun==false){
NotifyService.ServiceIsRun=true;
Intent intent = new Intent(getContext(),NotifyService.class);
getActivity().startService(intent);
}
.. мой XML-манифест:
<service
android:name=".NotifyService">
</service>
<receiver android:name=".NotifyBroadcast">
<intent-filter>
<action android:name="com.latestBabiaNews">
</action>
</intent-filter>
так что в результате запустилось мое приложение, также служба, но приложение зависало и все еще не отвечало, и на консоли Android Studio я все еще показываю работающую службу (с сообщением журнала)
Кроме того, когда я использую IntentService, он хорошо работает для меня, но с Service это не так? это проблема с многопоточностью или как?
1 ответ
Службы работают в одном потоке с остальной частью вашего приложения. Если вы блокируете сервис, вы блокируете все приложение.
Если вы хотите сделать что-то, что блокирует, запустите новый поток на вашем сервере. Просто убедитесь, что вы делаете это правильно (например, onStartCommand
может быть вызван несколько раз в течение срока службы вашего сервиса).
В качестве альтернативы вы можете настроить его так, чтобы ваш сервис делал все асинхронно и не блокировал. Будет ли это проще или нет, зависит от того, что сервис в конечном итоге делает.