Actualización de dos vistas de texto consecutivas mediante hilos

He estado leyendo sobre subprocesos en mi libro de Java y quería intentar hacer actualizaciones con dos subprocesos consecutivos al mismo tiempo.

Por supuesto, aunque los hilos no pueden actualizar la interfaz de usuario. He usado controladores un poco, pero solo pasando mensajeros de una clase a otra para capturar la ubicación de un servicio a una actividad.

Pero esto debe ser más simple que eso.

Supongo que debería usar AsyncTask pero quiero contar 1-10 en cada campo y no quiero seguir entrando y saliendo de la clase asynctask.

Cualquier consejo apreciado

Stephen

ACTUALIZACIÓN

Así que hice un poco más de experimentación. Escribí un método de controlador para manejar cualquier mensaje que se le envíe. Comprueba qué campo debe actualizarse y luego realiza un setText en dicho campo. Aqui esta el codigo

Handler myHandler = new Handler(){
 public void handleMessage(Message msg){
 msg = Message.obtain();
 Bundle bundle = msg.getData();

 String fieldName = bundle.getString("fieldName");
 int count = bundle.getInt("count");

 if(fieldName=="text1"){
     text1.setText(count);
 }else{
     text2.setText(count);
 }
}
};

Luego tengo un código en el onCreate de mi actividad que lanza dos subprocesos y cada subproceso pasa un mensaje con mi recuento int al controlador. También pasa un nombre de TextView para que mi controlador sepa qué vista de texto debería actualizar. Aquí está el código ...

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

 text1 = (TextView)findViewById(R.id.text1);
 text2 = (TextView)findViewById(R.id.text2);

 new Thread(){
   public void run(){
   for(int i=1;i<10;i++){
     message = Message.obtain(myHandler);
     Bundle bundle = new Bundle();
     bundle.putCharSequence("fieldName", "text1");
     message.setData(bundle);
     myHandler.sendMessageDelayed(message, 1000);
   }
      }
    }.start();

new Thread(){
   public void run(){
   for(int i=1;i<10;i++){
     message = Message.obtain(myHandler);
     Bundle bundle = new Bundle();
     bundle.putCharSequence("fieldName", "text2");
     message.setData(bundle);
     myHandler.sendMessageDelayed(message, 1000);
   }
 }
   }.start();    

} 

Pero recibo un error en setText

05-17 17: 13: 00.013: ERROR / AndroidRuntime (966): android.content.res.Resources $ NotFoundException: ID de recurso de cadena # 0x0

¿Alguna idea?

preguntado el 16 de mayo de 11 a las 19:05

"Supongo que debería usar AsyncTask pero quiero contar del 1 al 10 en cada campo y no quiero seguir entrando y saliendo de la clase asynctask". -- ¿Qué significa eso? -

2 Respuestas

Esto es lo que puede hacer. Está en el camino correcto acerca del uso de AsyncTask, así que amplíe la clase y ponga su conteo en la función de actualización de progreso. Deberías tener algo como esto:

private class BackgroundTask extends AsyncTask<Void, Void, Void> {
    int i;

    protected void onPreExecute() {
        i = 0;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        i++;
        publishProgress(i);
    }

    protected void onProgressUpdate(Integer... progress) {
        TextView tv1 = (TextView) Main.this.findViewById(R.id.textView1)
        TextView tv2 = (TextView) Main.this.findViewById(R.id.textView2)
        tv1.setText(i);
        tv2.setText(i);
    }

    protected void onPostExecute(Void result) {
        i = null;
    }
}

dónde Main es tu actividad y textView1 y textView2 son sus vistas de texto que va a actualizar.

contestado el 17 de mayo de 11 a las 00:05

Gracias chicos, intentaré estos dos métodos y les haré saber cómo me va. Stephen

Respondí mi propia pregunta por accidente. Consulte la respuesta adicional en esta publicación. - Stephen

Si realmente desea ejecutar dos subprocesos adicionales, puede hacerlo con controladores. Simplemente cree UN controlador para su actividad y encienda qué. Luego, inicie dos subprocesos y cuando cada subproceso se complete, envíe un mensaje al controlador usando el valor apropiado. Luego, actualice la vista de texto apropiada en el controlador ya que está de vuelta en el hilo de la interfaz de usuario en el controlador:

private Handler myHandler= new Handler(){
    @Override
    public void  handleMessage(Message msg){        
        switch(msg.what){
            case 0:
                this.removeMessages(0);
                Toast.makeText(Main.this,"Message0", Toast.LENGTH_SHORT).show();
            break;
            case 1:
                this.removeMessages(1);
                Toast.makeText(Main.this,"Message1", Toast.LENGTH_SHORT).show();
                break;
            default:
                super.handleMessage(msg);
                break;
        }
    }
};

Simplemente reemplace el brindis con el código de actualización de la interfaz de usuario. Puede lanzar un hilo como en:

    // DISPLAY ON CLICK HANDLER
    threadButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Thread thread= new Thread( new Runnable() {
                public void run() {
                    try {  // DO NOT TOUCH THE UI HERE
                    Thread.sleep(1000); // mimic time consuming task
                    }
                    catch(Exception e){   
                    }
                    myHandler.sendEmptyMessage(0);
                }
            });
            thread.setDaemon(true);
            thread.start();
        }
    });

Si solo desea contar desde i = 1-10 segundos, ni siquiera necesita usar hilos, solo use postMessageDelayed haciendo un bucle y llamando:

myHandler.sendEmptyMessageDelayed(0, 1000);  // what 0, 1 second

Puede pasar datos (preferiblemente inmutables) en los mensajes como en:

Message msg= Message.obtainMessage(0);
Bundle b= new Bundle();
b.putString("stringData",outString);
msg.setData(b);
handler.sendMessage(msg);

y recupéralo como en:

Bundle b= msg.getData();
String data="";
if (b != null){
    data= b.getString("stringData");
}

Si solo necesita un hilo adicional, usaría asyncTask.

contestado el 17 de mayo de 11 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.