Vous êtes sur la page 1sur 6

LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012


Versin: 05

Pg. 1 de 6


1. Tema de la leccin:
Acceso de objetos hijos de la clase android.view a travs de hilos secundarios
2. Supuesto original, antes de que se tuviera esta experiencia:
Es posible acceder y modificar objetos visuales de una actividad desde un hilo de
proceso secundario
3. La nueva interpretacin o supuesto:
Los objetos visibles en android (objetos hijos de la clase android.view) solo son
accesibles desde el hilo que los creo, es decir, desde el hilo principal. Si se intenta
modificar estos objetos desde un hilo secundario la aplicacin dar error y se cerrar
automticamente. Para resolver esto, y lograr realizar modificaciones a objetos
visuales desde hilos secundarios, es necesario hacer uso del objeto
android.os.Handler el cual puede recibir mensajes desde hilos secundarios y ejecutar
instrucciones en el hilo principal.



4. 1 2 ejemplos que confirman el nuevo supuesto:
Para demostrar como se debe acceder un recurso visual desde un hilo secundario, se
mostrar a continuacin un cdigo que intentar mostrar un contador que se
incrementa desde un hilo secundario y se visualizar en un textView creado por la
actividad principal

Archivo MainActivity:



LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012
Versin: 05

Pg. 2 de 6

package com.example.ejemplohilo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv=(TextView) findViewById(R.id.contadorViewer);
new Thread(new Runnable(){

@Override
public void run() {
// TODO Auto-generated method stub
int counter=0;
while(true){
tv.setText(""+counter++);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}).start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}
Archivo XML:



LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012
Versin: 05

Pg. 3 de 6

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text=""
android:id="@+id/contadorViewer"/>

</RelativeLayout>







Al ejecutar este codigo se puede verificar que la aplicacion es cerrada por el
administrador de tareas de android




LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012
Versin: 05

Pg. 4 de 6

EN el DDMS se puede verificar que el sistema arroja un error indicando que Solo el
hilo que originalmente cre una jerarqua de elementos Views, puede tocar esos
views


Para resolver este inconveniente se encontr un elemento llamado handler el cual puede
ser usado para comunicar el hilo secundario con el hilo principal de la siguiente manera:
package com.example.ejemplohilo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv=(TextView) findViewById(R.id.contadorViewer);
new Thread(new Runnable(){

@Override



LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012
Versin: 05

Pg. 5 de 6

public void run() {
// TODO Auto-generated method stub
int counter=0;
while(true){
h.sendEmptyMessage(counter++);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}).start();
}

Handler h= new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
TextView tv=(TextView) findViewById(R.id.contadorViewer);
tv.setText(""+msg.what);

}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

Haciendo uso del Handler como intermediario entre los threads, se resuelve el
problema y el programa abre correctamente, mostrando un contador ascendente que
cada segundo actualiza su valor.



LECCIONES APRENDIDAS FASE DE EJECUCIN

Fecha: Agosto de 2012
Versin: 05

Pg. 6 de 6


5. Por qu es importante la leccin:
Es importante para la implementacin de aplicaciones multihilos, ya que al conocer esta
leccin se evita el caer en el error antes expuesto y se ahorra tiempo en la
implementacin del proyecto.

Vous aimerez peut-être aussi