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 может быть вызван несколько раз в течение срока службы вашего сервиса).

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

Другие вопросы по тегам