IntentService не работает в определенных ситуациях - PullRequest
1 голос
/ 29 февраля 2012

У меня проблема. Время от времени IntentService UpdateService02 не запускается. Я помещаю записи в журнал, чтобы можно было отлаживать, и вот что я получаю ...

02-28 21: 37: 32.461: Основной - отправлено широковещательно

02-28 21: 37: 32.484: BroadcastReceiver - Main Started; Установить будильник

02-28 21: 37: 32.539: BroadcastReceiver - Служба полученной тревоги

02-28 21: 38: 32.500: BroadcastReceiver - Служба полученной тревоги

Обычно это должно происходить:

02-28 21: 37: 32.461: Основной - отправлено широковещательно

02-28 21: 37: 32.484: BroadcastReceiver - Main Started; Установить будильник

02-28 21: 37: 32.539: BroadcastReceiver - Служба полученной тревоги

02-28 21: 38: 32.500: UpdateService - onHandleIntent ()

Есть идеи? Вот мой код приемника вещания ...

Приемник вещания:

public class AlarmReceiver extends BroadcastReceiver {

    private static final int INTERVAL = 60*1000; // check every 60 seconds

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction() != null) {
            if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
                Log.v(TAG, "BroadcastReceiver - Received Boot Completed; Set Alarm");

                setRecurringAlarm(context);
            }else if(intent.getAction().equalsIgnoreCase(Main.BROADCAST_STARTUP)){
                Log.v(TAG, "BroadcastReceiver - Main Started; Set Alarm");

                setRecurringAlarm(context);
            }else{
                Log.v(TAG, "BroadcastReceiver - Received " + intent.getAction());
            }
        }else{
            Log.v(TAG, "BroadcastReceiver - Received AlarmService");

            Intent i = new Intent(context, UpdateService02.class);
            context.startService(i);
        }
    }

    private void setRecurringAlarm(Context context) {
        Intent receiver = new Intent(context, AlarmReceiver.class);
        PendingIntent recurringDownload = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarms.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL, recurringDownload);
    }
}

Intent Service:

public class UpdateService02 extends IntentService {

    static DefaultHttpClient mClient = Client.getClient();
    private static final int LIST_UPDATE_NOTIFICATION = 100;

    public UpdateService02() {
        super("UpdateService02");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.v(TAG, "UpdateService -- onHandleIntent()");

        try {
            HttpGet httpget = new HttpGet(url);
            HttpResponse response;
            response = mClient.execute(httpget);
            BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));

            Intent i = new Intent(BROADCAST_UPDATE);  
            i.putExtra("text", in.readLine().toString() + " updated");
            sendBroadcast(i);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Я подумал, что, возможно, мне нужно установить контекст запуска intentservice для приложений, но я, честно говоря, понятия не имею.

Ответы [ 2 ]

1 голос
/ 01 августа 2012

Я выяснил проблему ...

Я изменил это:

try {
    HttpGet httpget = new HttpGet(url);
    HttpResponse response;
    response = mClient.execute(httpget);
    BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));

    Intent i = new Intent(BROADCAST_UPDATE);  
    i.putExtra("text", in.readLine().toString() + " updated");
    sendBroadcast(i);
} catch (ClientProtocolException e) {

на это:

try {
    HttpGet httpget = new HttpGet(url);
    HttpResponse response;
    response = mClient.execute(httpget);
    BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));

    Intent i = new Intent(BROADCAST_UPDATE);  
    i.putExtra("text", in.readLine().toString() + " updated");
    sendBroadcast(i);
    in.close();
} catch (ClientProtocolException e) {

Иногда читатель "забивается"и в следующий раз, когда ему позвонили, он все равно застрял бы, пытаясь обработать последний запрос.Добавление in.close(); убедило меня закрыть его после каждого использования.Отлично работает сейчас.

0 голосов
/ 29 февраля 2012

Услуга будет запущена только один раз. Если вы вызываете startService () для уже запущенной службы, никакого эффекта не будет. См. http://developer.android.com/guide/topics/fundamentals/services.html.

A service is "started" when an application component (such as an activity) starts it by
calling startService(). Once started, a service can run in the background indefinitely,
even if the component that started it is destroyed. 

Когда служба не работает, намерение должно работать правильно.

Относительно

IntentService with the HTTPClient works fine and then when I switch over to Wifi the HTTPClient gets an UnknownHostException.

UnknownHostException возникает, когда нет правильного сетевого соединения. Проверьте правильность сетевого подключения.

...