Utilicé IntentService en mi código en lugar de Service porque IntentService crea un hilo para mí en onHandleIntent (intento de intención), así que no tengo que crear un Thead en el código de mi servicio.Comportamiento inesperado de IntentService
Esperaba que dos intenciones al mismo IntentSerivce se ejecutarán en paralelo porque se genera un hilo en IntentService para cada invención. Pero mi código resultó que los dos intentos se ejecutaron de forma secuencial.
Este es mi 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.");
}
}
}
Y el llamado código de servicio es el siguiente:
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);
}
}
vi este mensaje de registro en el registro:
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
El el registro muestra que el segundo intento esperó el primer intento de finalizar y están en el mismo hilo.
Hay algo que malinterpreté de IntentService. Para hacer que dos intentos de servicio se ejecuten en paralelo, ¿tengo que reemplazar IntentService por el servicio e iniciar un hilo yo mismo en el código de servicio?
Gracias.
El patrón de diseño de IntentService es una cola de trabajos que garantiza que las solicitudes se pongan en cola y no se procesen en paralelo. Como se señala a continuación, puede disparar una AsyncTask para cada trabajo paralelo. Asegúrese de que su código de servicio sea reentrante. – mobibob