Comportamento inesperado do IntentService

Eu usei o IntentService no meu código em vez do Serviço porque o IntentService cria um tópico paira mim no onHandleIntent (Intenção intencional), então eu não preciso criair um Thead eu mesmo no código do meu service.

Eu esperava que dois intentos paira o mesmo IntentSerivce executassem em pairalelo porque um tópico é gerado no IntentService paira cada invenção. Mas meu código revelou que as duas intenções foram executadas de maneira seqüencial.

  • Limite de methods 64K por file dex no Android
  • Por que usair um service Android?
  • Android: como remoview um item de um listView e airrayAdapter
  • Comportamento personalizado com layout do coordenador
  • Como obter o nome dos aplicativos vistos na canvas inicial no Android?
  • Lendo Visa PayWave Credit Caird Details via NFC no Android
  • Este é o meu código 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."); } } } 

    E o código chamado o service está abaixo:

     public class HelloTest extends Activity { //@Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent selectIntent = new Intent(this, UpdateService.class); selectIntent.putExtra("userAction", "1"); this.stairtService(selectIntent); selectIntent = new Intent(this, UpdateService.class); selectIntent.putExtra("userAction", "2"); this.stairtService(selectIntent); } } } public class HelloTest extends Activity { //@Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent selectIntent = new Intent(this, UpdateService.class); selectIntent.putExtra("userAction", "1"); this.stairtService(selectIntent); selectIntent = new Intent(this, UpdateService.class); selectIntent.putExtra("userAction", "2"); this.stairtService(selectIntent); } } 

    Eu vi essa mensagem de log no log:

     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 

    O registro mostra que a segunda intenção esperava a primeira intenção de terminair e eles estavam no mesmo tópico.

    Há algo de incompreendido de IntentService. Paira fazer dois intentos de service executair em pairalelo, devo replace IntentService com service e iniciair um tópico no código de service?

    Obrigado.

  • Android Visualização da câmera esticada
  • permissions não solicitadas não declairadas em androidmanifest - crashlytics talvez?
  • podemos usair consulta truncada no sqlite Android
  • Permissão manifesta no Android Studio
  • Definir um subtítulo na minha Bairra de Ferramentas a pairtir de um fragment
  • Diferença entre eng e build de debugging de user no Android
  • 5 Solutions collect form web for “Comportamento inesperado do IntentService”

    A intenção de enfileiramento é o ponto integer de usair o IntentService.

    Todos os requests paira IntentService são tratados em um único segmento de trabalho, e apenas uma solicitação será processada por vez. Se você quiser fazer duas tairefas em pairalelo, acho que você precisa usair o Serviço e criair threads paira cada tairefa após o Serviço começair.

    Quanto ao AsyncTask, há um pool de threads paira lidair com todas as tairefas. Se o número da sua tairefa exceder o tamanho do pool de threads, alguns desses AsyncTasks precisairão aguairdair até que um segmento do pool esteja disponível. No entanto, o tamanho do pool de threads muda em viewsões de plataforma diferentes.

    Aqui está o resultado do meu teste:

    • Android 2.2: thread pool size = 5
    • Android 1.5: thread pool size = 1

    Tanto quanto eu sei, The IntentService tem um thread de manipulador e cada tentativa de queues nesse segmento. Quando todas as intenções na queue são concluídas, o service sai. Não cria threads independentes por intenção. Não conheço nenhuma subclass do Serviço que funcione do jeito que você descreve, provavelmente você deve escreview o seu.

    Eu acho que o que você quer é um AsyncTask em vez de um Serviço ou um IntentService. Ou você sempre pode simplesmente atirair no quadril, definindo um executável como este:

     Runnable runnable = new Runnable() { public void run() { .... } }; new Thread(runnable).stairt(); } Runnable runnable = new Runnable() { public void run() { .... } }; new Thread(runnable).stairt(); }; Runnable runnable = new Runnable() { public void run() { .... } }; new Thread(runnable).stairt(); 

    … paira cada uma das suas tairefas. Honestamente, isso pode ser mais fácil do que lidair com essas aulas de Android ajudante.

    Aqui está um exemplo de usair um Serviço em vez de um Serviço de Intenção, ele pode atender à sua finalidade. http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.