Неожиданное поведение IntentService

Я использовал IntentService в своем коде вместо Сервиса, потому что IntentService создает поток для меня в onHandleIntent (Поглощенное намерение), таким образом, я не должен создавать Thead сам в коде моего сервиса.

Я ожидал, что два намерения к тому же IntentSerivce выполнятся параллельно, потому что поток сгенерирован в IntentService для каждого, изобретают. Но мой код оказался что эти два намерения, выполняемые последовательным способом.

Это - мой код IntentService:

public class UpdateService extends IntentService {

    public static final String TAG = "HelloTestIntentService";

    public UpdateService() {
        super("News UpdateService");
    }

    protected void onHandleIntent(Intent intent) {

        String userAction = intent
        .getStringExtra("userAction");

        Log.v(TAG, "" + new Date() + ", In onHandleIntent for userAction = " + userAction + ", thread id = " + Thread.currentThread().getId());

        if ("1".equals(userAction)) {
            try {
                Thread.sleep(20 * 1000);
            } catch (InterruptedException e) {
                Log.e(TAG, "error", e);
            }

            Log.v(TAG, "" + new Date() + ", This thread is waked up.");
        }
    }
}

И код звонит, сервис ниже:

public class HelloTest extends Activity {

    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Intent selectIntent = new Intent(this, UpdateService.class);
        selectIntent.putExtra("userAction",
                "1");

        this.startService(selectIntent);

        selectIntent = new Intent(this, UpdateService.class);
        selectIntent.putExtra("userAction",
                "2");

        this.startService(selectIntent);

    }
}

Я видел, что этот журнал обменивался сообщениями в журнале:

V/HelloTestIntentService(  848): Wed May 05 14:59:37 PDT 2010, In onHandleIntent for userAction = 1, thread id = 8
D/dalvikvm(  609): GC freed 941 objects / 55672 bytes in 99ms
V/HelloTestIntentService(  848): Wed May 05 15:00:00 PDT 2010, This thread is waked up.
V/HelloTestIntentService(  848): Wed May 05 15:00:00 PDT 2010, In onHandleIntent for userAction = 2, thread id = 8
I/ActivityManager(  568): Stopping service: com.example.android/.UpdateService

Журнал показывает, что второе намерение ожидало первое намерение закончиться, и они находятся в том же потоке.

Это там что-либо я неправильно понял IntentService. Чтобы заставить два сервисных намерения выполниться параллельно, я должен заменить IntentService сервисом и запустить поток сам в служебном коде?

Спасибо.

5
задан user256239 5 May 2010 в 22:14
поделиться

3 ответа

Насколько мне известно, IntentService имеет один поток обработчика, и каждое намерение стоит в очереди в этом потоке. Когда все намерения в очереди выполнены, служба завершает работу. Он не создает независимых потоков для каждого намерения. Я не знаю каких-либо подклассов Service, которые работают так, как вы описываете, вам, вероятно, придется написать свой собственный.

6
ответ дан 18 December 2019 в 06:49
поделиться

В очереди намерений заключается весь смысл использования IntentService.

9
ответ дан 18 December 2019 в 06:49
поделиться

Я думаю, что вам нужна AsyncTask, а не Service или IntentService. Или вы всегда можете просто выстрелить от бедра, определив runnable, как это:

Runnable runnable = new Runnable() {

    public void run() {
        ....
    }
};
new Thread(runnable).start();

... для каждой из ваших задач. Честно говоря, это может быть проще, чем разбираться с этими вспомогательными классами Android.

1
ответ дан 18 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: