2011-06-10 13 views
5

Estoy trabajando en aprender Android. A partir de los documentos que he leído hasta ahora, no puedo entender cómo mostrar la visualización de salpicadura (durante la suspensión, la pantalla permanece en blanco). Parece que necesito comenzar una nueva actividad para el diseño principal, pero esto parece un desperdicio (el efecto debería desaparecer para siempre, me gustaría reutilizar su hilo).Android: la pantalla de presentación no se muestra, ¿por qué?

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class Ext3 extends Activity { 

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

     Log.v("Ext3", "starting to sleep"); 

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

     Log.v("Ext3", "done sleeping"); 

     setContentView (R.layout.main); 
    } 

} 

Respuesta

7

Creo que su pantalla de bienvenida no se muestra porque nunca se da el hilo de interfaz de usuario (que está en) la oportunidad de dibujar ya que sólo dormir allí sin hacer nada.

En lugar del Thread.sleep, le sugiero que busque en un Timer o algo así para programar la actualización y cambiar el contenido de su vista; una alternativa sería comenzar un AsyncTask donde podría dormir antes de cambiar la vista como lo está haciendo ahora.

No duerma o de cualquier otra manera bloquear el hilo de interfaz de usuario, eso es malo ... (provoca ANR)

+1

visite http: //www.anddev.org/simple_splash_screen-t811.html para ver ejemplos de cómo lograr esto. – levis501

+0

Así que aparentemente mi convicción de que, entre llamar a la función y devolver su trabajo, es incorrecta. Esto llama seriamente el modelo de máquina que tenía en cuestión. Aparentemente el hilo hace más que mi código. ¿Qué y cuándo son estas acciones? – kasterma

+1

@kasterma: esto se describe en Ciclo de vida de la actividad en [Documentos de la actividad] (http://developer.android.com/reference/android/app/Activity.html) y en [Administrar el ciclo de vida de la actividad] (http: // sección developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle) de la guía de actividades. –

1

Cuando se llama a sleep así, estás bloqueando el hilo de interfaz de usuario. En su lugar, ingrese la segunda llamada al setContentView en un Runnable, cree un controlador y use el método postDelayed del controlador para ejecutar Runnable. Algo como esto:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 
    Runnable endSplash = new Runnable() { 
     @Override 
     public void run() { 
      setContentView (R.layout.main); 
     } 
    } 
    new Handler().postDelayed(endSplash, 5000L); 
} 
+0

Ver mi comentario en la respuesta de @Matthieu, esperaría dormir en el hilo de la interfaz de usuario para bloquear cualquier interacción adicional. Pero ya configuré el diseño; con mi modelo mental no debería poder bloquear nada más. – kasterma

+1

Al configurar el diseño no se genera automáticamente la pantalla. Es código dentro del marco que se ejecuta después de que 'onCreate' regrese. Como no volvería hasta que haya cambiado la vista de contenido, la pantalla de bienvenida nunca tuvo una oportunidad. La interfaz de usuario completa de la aplicación se detuvo durante la suspensión. –

1

he tratado este código en mi aplicación y su trabajo perfectly.May ser que le ayudará.

public class SplashScreen extends Activity { 

    /** 
    * The thread to process splash screen events 
    */ 
    private Thread mSplashThread; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Splash screen view 
     setContentView(R.layout.splash); 



     final SplashScreen sPlashScreen = this; 

     // The thread to wait for splash screen events 
     mSplashThread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        synchronized (this) { 
         // Wait given period of time or exit on touch 
         wait(5000); 
        } 
       } catch (InterruptedException ex) { 
       } 

       finish(); 

       // Run next activity 
       Intent intent = new Intent(); 
       intent.setClass(sPlashScreen, MainActivity.class); 
       startActivity(intent); 
       stop(); 
      } 
     }; 

     mSplashThread.start(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     return false; 
    } 

    /** 
    * Processes splash screen touch events 
    */ 
    @Override 
    public boolean onTouchEvent(MotionEvent evt) { 
     if (evt.getAction() == MotionEvent.ACTION_DOWN) { 
      synchronized (mSplashThread) { 
       mSplashThread.notifyAll(); 
      } 
     } 
     return true; 
    } 

} 
+0

Comenzar una nueva actividad seguramente es más trabajo que comenzar un nuevo hilo. – kasterma

+0

@kasterma - no necesariamente. Hay mucho que decir acerca de ese enfoque. Mantiene la pantalla de bienvenida separada de la actividad principal, para uno. El principal problema con esto es que el objetivo principal de una pantalla de presentación (en mi opinión) es realizar una inicialización que consuma tiempo y que evite que la vista principal se muestre de inmediato. Hacer la inicialización en una actividad de salpicadura por separado significa tener que transferir los datos inicializados a la actividad principal. (Por otro lado, no es correcto llamar al método obsoleto stop() en el método run() del subproceso; no sé por qué lo hace la gente). –

0

Este es el fragmento de una pantalla de presentación básica

public class Splash extends Activity { 

//private ProgressDialog pd = null; 
private final int SPLASH_DISPLAY_LENGTH = 3000; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.splashscreen); 
    //this.pd = ProgressDialog.show(this, "Initializing..", "Initializing Infraline...", true, false); 

    /* New Handler to start the InfralineTabWidget-Activity 
    * and close this Splash-Screen after some seconds.*/ 

    new Handler().postDelayed(new Runnable(){ 
     @Override 
     public void run() { 
     /* Create an Intent that will start the InfralineTabWidget-Activity. */ 
      Intent mainIntent = new Intent(Splash.this,InfralineTabWidget.class); 
      Splash.this.startActivity(mainIntent); 
      Splash.this.finish(); 
     } 
    }, SPLASH_DISPLAY_LENGTH); 

} 

} 

Y en su AndroidManifest.xml poner

<activity android:name=".Splash" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation|keyboardHidden"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Esperemos que esto funcione para usted :)

Cuestiones relacionadas