Android multihilo: IntentService entender y resumen de uso

 

A, Android en IntentService

1.1 El papel principal

La puesta en práctica de una serie de tareas en segundo plano de alta prioridad. Porque pertenece Servicio, en términos que un simple hilo de mayor prioridad.

1.2 Principio

IntentService encapsula HandlerThread y una Handler.

  1. Cuando se crea iniciar una HandlerThread IntentService, mientras Handler HandlerThread vinculante. Por lo tanto, los mensajes enviados por el controlador se realizan en HandlerThread.
  2. Entonces IntentService en el ciclo de vida de onStartCommandretiro onStartserá enviado utilizando el objeto de Intención aprobada en forma de mensajes de Handler.
  3. Manejador será llamado después de recibir el mensaje de onHandleIntentun método tan abstracto que necesitamos para lograr su propia lógica de procesamiento. Por último procesado stopSelf(msg.arg1);de espera para todas las tareas a IntentService final completo;

1.3 Características

Heredada de servicio, es una clase abstracta, debe crear una subclase de uso.

Dos, el uso IntentService

Paso 2.1 y ejemplos

El siguiente ejemplo utiliza dos IntentService realizan tareas asíncronas emitir simultáneamente horario LocalBroadcastManager envió a informar a las dos tareas.
Disposición dos botones (1) IntentServiceTestActivity para el inicio de dos tareas, dos tareas se muestran ProgressBar. También hay un TextView para la visualización de registro.
(2) definir una subclase IntentService, debe crear un nombre de constructor pasado como parámetro del trabajador hilos IntentService. Hay dos ejemplos para diferentes ID de tarea de procesamiento de la información y el progreso notable. realización concreta de la cuenta de ciclo y aumentar enviado oportunamente a IntentServiceTestActivity interfaz de usuario actualizada.

 

public class IntentServiceTest extends IntentService {
    ...
    // 必须创建该构造函数
    public IntentServiceTest() {
        super(IntentServiceTestActivity.TAG_MYINTENTSERVICE);
    }
    ...
}

(3) La intención IntentServiceTestActivity para iniciar la transmisión de diferentes IntentService a través de diferentes botones. Diferentes parámetros marcan el ID de tarea.

 

public void onClick(View v) {
    switch (v.getId()){
        case R.id.btn_task1:
            Intent intentTask1 = new Intent(IntentServiceTestActivity.this,IntentServiceTest.class);
            intentTask1.putExtra("taskId",0);
            startService(intentTask1);
            break;
        case R.id.btn_task2:
            Intent intentTask2 = new Intent(IntentServiceTestActivity.this,IntentServiceTest.class);
            intentTask2.putExtra("taskId",1);
            startService(intentTask2);
            break;
    }
}

(4) de IntentServiceTest onHandleIntent()mensajes del asimiento voluntad de objeto intención, y luego realizar tareas específicas.

 

    // 实际处理任务
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        sendThreadStatus("IntentServiceTest开始处理 --> onHandleIntent()");
        // intent已经通过IntentService内部的Handler传递过来
        int taskId = intent.getIntExtra("taskId",0);
        if(taskId == 0){
            startThread(0);
        } else {
            startThread(1);
        }
    }
    //根据不同的taskId来标记不同的进度
    private void startThread(int taskId){
        try {
            Thread.sleep(1000);
            //发送线程状态
            sendThreadStatus("线程启动 --> startThread()");
            boolean runnIng = true;
            mProgress[taskId] = 0;
            while (runnIng){
                mProgress[taskId] ++;
                if(mProgress[taskId] >= 100){
                    runnIng = false;
                }
                sendThreadStatus("线程Running --> startThread()");
                Thread.sleep(30);
            }
            sendThreadStatus("线程结束 --> startThread()");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    ...

(5) El anterior sendThreadStatus("")procedimiento para la transmisión de difusión por estado hilo:

 

    /**
     * 通过mLocalBroadcastManager发送IntentService的状态信息
     * @param status
     */
    private void sendIntentServiceStatus(String status) {
        Intent intent = new Intent(IntentServiceTestActivity.ACTION_INTENTSERVICE_STATUS);
        intent.putExtra("status",status);
        mLocalBroadcastManager.sendBroadcast(intent);
    }
    /**
     * 通过mLocalBroadcastManager发送工作线程的状态信息
     * @param status
     */
    private void sendThreadStatus(String status) {
        Intent intent = new Intent(IntentServiceTestActivity.ACTION_THREAD_STATUS);
        intent.putExtra("status",status);
        intent.putExtra("progress",mProgress);
        mLocalBroadcastManager.sendBroadcast(intent);
    }

(6) IntentServiceTestActivity define MyBroadcastReceiver mensaje de difusión recibido programa de actualización más ProgressBar transmite.

 

public class MyBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        switch (intent.getAction()){
            case ACTION_INTENTSERVICE_STATUS:
                mInfoText.setText(mInfoText.getText().toString()+"\n"+intent.getStringExtra("status"));
                break;
            case ACTION_THREAD_STATUS:
                int[] progress = intent.getIntArrayExtra("progress");
                mProgressBar1.setProgress(progress[0]);
                mProgressBar2.setProgress(progress[1]);
                mPb1.setText(progress[0]+"%");
                mPb2.setText(progress[1]+"%");
                mInfoText.setText(intent.getStringExtra("status"));
                break;
        }
    }
}

(7) Recuerde Registro IntentService. <service android:name=".mythread.IntentServiceTest"/>Los resultados operativos incluyen:

  • Realizar la misma tarea dos veces seguidas:

Haga clic dos veces Task1.gif

  • Continuamente realiza dos tareas:

 

Haga clic .gif dos tareas


Podemos ver, si se trata de cómo agregar tareas se ejecutan secuencialmente uno a uno. Una vez terminadas todas las tareas IntentServiceTest ejecutado onDestroy().

 

2.2 Precaución IntentService

  1. IntentService no se recomienda bindService()de forma, porque IntentService de onBind vuelve por defecto nulo. Si puede comunicarse con la carpeta o Messenger, no se invoca onHandleIntent()el método, IntentService sólo un servicio ordinario a.

 

public IBinder onBind(Intent intent) {
        return null;
    }
  1. Una vez IntentService se detiene, que se almacena en la cola de mensajes de tareas que se borrará, no se ejecutará.

Artículos relacionados:
Android multihilo: Comprender y utilizar simple resumen

Reproducido: https://www.jianshu.com/p/783015252b04 

Publicado 49 artículos originales · ganado elogios 2 · Vistas 8587

Supongo que te gusta

Origin blog.csdn.net/yangjunjin/article/details/105030754
Recomendado
Clasificación