Deshabilitar escalado al fondo de un layout

Me tope por ahi un problema con los fodos para los layouts. Estos son escalados y al parecer no hay forma de decirle al layout de que modo queremos que escale (o mas bien que no lo haga) el fondo.

Por ejemplo, supongamos que queremos usar un “tablero de ajedrez” de fondo para el siguiente layout

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" 
android:orientation="vertical"
android:layout_width="fill_parent" 
android:background="@drawable/
<TextView android:id="@+id/TextView01" 
android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:text="Name:" />
	<EditText android:id="@+id/EditText01" 
		android:layout_height="wrap_content"
		android:layout_width="fill_parent" 
		android:hint="Type your name here" />
	<TextView android:id="@+id/TextView02" 
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:text="Email:" />
	<EditText android:id="@+id/EditText02" 
		android:layout_height="wrap_content"
		android:inputType="textEmailAddress" 
		android:layout_width="fill_parent"
		android:hint="Type your email address" />

	<Button android:id="@+id/Button01" 
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content" 
		android:text="Save" 
		android:layout_gravity="center_horizontal" 
		android:paddingLeft="40dip" 
		android:paddingRight="40dip" />
</LinearLayout>

nos da como resultado, en portrait:

Portrait Layout with background

Portrait Layout with background

y en landscape

Landscape Layout with Background

Landscape Layout with Background

Como ven, el fondo es escalado sin posibilidad de poder definirle algún modo de escalado. Leyendo en foros me encontre esta solución, bastante ingeniosa, ojo, yo no soy el autor, pero si me parece importante rescatar la información y comentarla

Básicamente es no usar el backgraound del layout, sino más bien utilizar un FrameLayout y un ImageView.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<ImageView 
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" 
		android:src="@drawable/back"
		android:scaleType="center" />

	<LinearLayout>
		<!-- your views -->
	</LinearLayout>
</FrameLayout>

Para el ejemplo anterior, el layout quedaria como:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
>
	<ImageView 
		android:src="@drawable/hdpi_bg"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:scaleType="center"
	/>
	<LinearLayout 
		android:layout_height="wrap_content" 
		android:orientation="vertical"
		android:layout_width="fill_parent" 
	>
		
		<TextView android:id="@+id/TextView01" 
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" 
			android:text="Name:" />
		<EditText android:id="@+id/EditText01" 
			android:layout_height="wrap_content"
			android:layout_width="fill_parent" 
			android:hint="Type your name here" />
		<TextView android:id="@+id/TextView02" 
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" 
			android:text="Email:" />
		<EditText android:id="@+id/EditText02" 
			android:layout_height="wrap_content"
			android:inputType="textEmailAddress" 
			android:layout_width="fill_parent"
			android:hint="Type your email address" />
	
		<Button android:id="@+id/Button01" 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:text="Save" 
			android:layout_gravity="center_horizontal" 
			android:paddingLeft="40dip" 
			android:paddingRight="40dip" />
	</LinearLayout>
</FrameLayout>

Y se veria así

Layout "framed" in FrameLayout

Layout "framed" in FrameLayout

Y en landscape

LinearLayout "framed" in FrameLayout (landscape)

LinearLayout "framed" in FrameLayout (landscape)

Me parece una buena forma de aprovechar la propiedad de modo de escalado del ImageView y la verdad no agrega mayor complicación envolver nuestro layout original con el FrameLayout. Si alguien tiene otra solución me encantaría conocerla.

Encolar tareas en el hilo de UI desde otro hilo.

Al hacer aplicaciones para Android puede que aveces ocupamos hacer tareas complejas que pueden llegar a bloquear el hilo actual de ejecución. Por razones obvias, estas tareas normalmente se deben hacer en un hilo “secundario”, aparte del hilo principal de las interfaz.

A veces esto complica poder notificar al usuario. En el caso de que utilicemos una clase que implement AsyncTask, por ejemplo, tenemos la ventaja de que onPreExecute(), onProgress() y onPostExecute(), son invocados directamente desde el hilo de UI. En el caso de que el resultado del método doInBackground() de algún problema, podemos desplegar un dialogo desde el onPostExecute.

class MyAsyncTask extends AsyncTask{

        @Override
        protected void onPostExecute(Void result) {
            // Notifique al usuario como resulto la operación
        }

        @Override
        protected void onPreExecute() {
            // Prepare la actividad para iniciar la tarea. Puede usar un progress bar,
            // pero ocupa sobreescribir el onProgress 

        }

        @Override
        protected Void doInBackground(Integer... params) {
            // Aqui va la tarea pesada, como accesar un API, base de datos, etc
            return null;
        }

    }

También se puede utiliar el método runOnUiThread de la clase Activity. Simplemente enviamos una instancia de Runnable como parametro del método y si esto se invoka de un hilo secundario, se enviara a la cola de mensajes del hilo principal de UI. Si fuese el mismo hilo de UI, se ejecuta inmediatamente.

Por último,  en el caso de que tengamos algún servicio corriendo en un hilo propio, esto puede ser mas complicado. Para ello, android provee la clase Handler. Esta permite enviar objetos Runnable o Message de un hilo secundario al hilo principal de UI.