Android cambia Actividad después de unos segundos

Necesito ayuda con mi primer proyecto de Android. Quiero escribir una aplicación que está mostrando una imagen con un ImageView por unos segundos, lo diría unos 4 segundos y después de que cambie a una segunda actividad que muestra un botón (sólo para la prueba).

Mi problema es que mi aplicación después de haber empezado en mi AVD saltar sobre la imagen y muestra inmediatamente el botón.

¿Cómo puedo arreglarlo? Miré tan largo y probé tantas cosas Espero que alguien de ustedes tenga una idea 🙂

Gracias por ayudar

Aquí mi código de mi MainActivity:

package com.example.parkourspots; public class MainActivity extends Activity { private ViewTreeObserver vto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View myLayout = findViewById(R.id.startscreen); vto = myLayout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){ @Override public void onGlobalLayout(){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Intent intent = new Intent(MainActivity.this, select_activity_class.class); startActivity(intent); } }); }} 

Compruebe este código.

 package com.example.parkourspots; public class MainActivity extends Activity { private static int TIME_OUT = 4000; //Time to launch the another activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View myLayout = findViewById(R.id.startscreen); new Handler().postDelayed(new Runnable() { @Override public void run() { Intent i = new Intent(MainActivity.this, ActivityTwo.class); startActivity(i); finish(); } }, TIME_OUT); } }); 

1) Dormir 500 sólo duerme durante .5 segundos. Así que parpadearía rápidamente de todos modos

2) El dormir no permite que el hilo vuelva al looper, así que congela su UI. Esto significa que no se actualizará y dibujará de todos modos. Utilice un temporizador en su lugar. O publicar un mensaje a un manejador sería aceptable aquí.

Puedes probar:

 public class MainActivity extends Activity { private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler.postDelayed(new Runanble() { @Override public void run() { Intent intent = new Intent(MainActivity.this, select_activity_class.class); startActivity(intent); } }, 4000); // 4 seconds } } 

En adición, puede agregar esto para su segunda declaración de actividad en AndroidManifest: android:finishOnTaskLaunch="true"

El problema es que usted está durmiendo sólo por 500 milisegundos (la mitad de un segundo), por lo que tiene sentido que suceda aparentemente-inmediatamente. También va a querer quitar el OnGlobalLayoutListener después de que se llame. He aquí un ejemplo de un enfoque que debería funcionar para usted:

 final Handler handler = new Handler(); // Create a Handler on the main Thread vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){ @Override public void onGlobalLayout(){ removeOnGlobalLayoutListener(vto, this); handler.postDelayed(new Runnable(){ public void run(){ Intent intent = new Intent(MainActivity.this, select_activity_class.class); startActivity(intent); } }, 4000); //Post back to the main Thread after 4000 mils (4 seconds) } }); @SuppressLint("NewApi") public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ if (Build.VERSION.SDK_INT < 16) v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); else v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); } 

nunca detenga el hilo de la interfaz de usuario. El hilo de la interfaz de usuario es responsable de mantener la sensación de respuesta de tu aplicación.

Pero esta es una solución rápida y alternativa para su problema.

 public class MyActivity extends Activity { private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler.postDelayed(new Runnable() { public void run() { doStuff(); } }, 5000); } private void doStuff() { Intent intent = new Intent(MainActivity.this, select_activity_class.class); startActivity(intent); } } 

Luego 5 segundos después de que la intención debe comenzar.

Pero recomiendo tarea asíncrona

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.