2012-04-04 13 views
5

Acabo de publicar ayer mi primera aplicación de Android. No probé en Android 4.0 y mi amigo acaba de decirme que mi aplicación está bloqueada en su galaxia S2 (4.0.3)Mi aplicación funciona en Android 2.3.3 a Android 3.1 pero se detiene con error en 4.0 +

Se está bloqueando después de unos segundos en mi actividad de pantalla de bienvenida, son solo unas pocas líneas de código tal vez ustedes pueden comprobarlo:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splashscreen); 

    try 
    { 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
    overridePendingTransition(0 , 0); 

    // thread for displaying the SplashScreen 
    Thread splashTread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       int waited = 0; 
       while(_active && (waited < _splashTime)) { 
        sleep(100); 
        if(_active) { 
         waited += 100; 
        } 
       } 
      } catch(InterruptedException e) { 
       // do nothing 
      } finally { 
       // finish(); 

       try 
       { 
        /* 
        Intent i = new Intent(); 
        i.setClass(SplashScreen.this, MainActivity.class); 
        startActivity(i); 
        finish(); 
        */ 
       } 
       catch(Exception e) 
       { 
        ki(e); 
       } 

       stop(); 
      } 
     } 
    }; 

    splashTread.start(); 

    } 
    catch(Exception ex) 
    { 
     ki(ex); 
    } 

} 

@Override 
public void onBackPressed() { 
    return; 
} 



//Toaster 
    public void ki(Exception message) 
    { 


    Toast myToast = Toast.makeText(getApplicationContext(), message.toString(), 1); 
    myToast.show(); 

} 

Obras verry así en Android 2.3 a 3.1, pero no puedo averiguar cuál es el problema con 4.0+

por favor, ayuda gracias!

Editar:

si elimino mi hilo que todo funciona bien. Entonces mi nueva pregunta es ... ¿Qué hay de nuevo con los hilos en 4.0? Acabo de ejecutar un hilo que no hace nada e incluso tengo el bloqueo.

+1

¡Busque en LogCat! –

+1

Sería muy útil si puedes compartir LogCat – Naved

+0

http://tinyurl.com/7tyuqbw – weakwire

Respuesta

5

Tuve el mismo problema al usar stop() en Android 4.0. Intenta usar finish(), eso resolvió mi problema.

+0

Gracias hombre que hizo mi día. –

+1

Esta respuesta es incorrecta. finish() cierra la actividad, no detiene el subproceso. En este caso, el subproceso sale naturalmente de todos modos, pero en todas las demás circunstancias, el subproceso continuará funcionando incluso después de la muerte de la actividad. – Graeme

3

Supongo que stop() ya no funciona en ICS.

Mi tutorial at droidnova.com no está actualizado para trabajar en ICS, lo siento, no tuve tiempo para eso. Hoy usaría un controlador en lugar del hilo por separado. Mucho más fácil de usar y más robusto.

8

Thread.stop(), resume() y suspend() ya no funciona con Android 4.0. El código fuente está a continuación:

/** 
* Requests the receiver Thread to stop and throw ThreadDeath. The Thread is 
* resumed if it was suspended and awakened if it was sleeping, so that it 
* can proceed to throw ThreadDeath. 
* 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final void stop() { 
    stop(new ThreadDeath()); 
} 

/** 
* Throws {@code UnsupportedOperationException}. 
* 
* @throws NullPointerException if <code>throwable()</code> is 
*   <code>null</code> 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final synchronized void stop(Throwable throwable) { 
    throw new UnsupportedOperationException(); 
} 

Una gran cantidad de bloqueos de aplicaciones en Android 4.0 debido a esto. Esto no es culpa de Google; desde hace años, Java SDK ha desalentado el uso de stop() en un hilo.

Presupuesto de cambios:

Commit: a7ef55258ac71153487357b861c7639d627df82f [a7ef552] 
Author: Elliott Hughes <[email protected]> 
Date: 2011-02-23 6:47:35 GMT+08:00 

Simplify internal libcore logging. 

Expose LOGE and friends for use from Java. This is handy because it lets me use 
printf debugging even when I've broken String or CharsetEncoder or something 
equally critical. It also lets us remove internal use of java.util.logging, 
which is slow and ugly. 

I've also changed Thread.suspend/resume/stop to actually throw 
UnsupportedOperationException rather than just logging one and otherwise 
doing nothing. 

Bug: 3477960 
Change-Id: I0c3f804b1a978bf9911cb4a9bfd90b2466f8798f 
7

como dice @Yuku, Thread.stop() no es de alguna manera roto en el ICS ha cambiado específicamente para lanzar una excepción, ya que no es seguro:

http://developer.android.com/reference/java/lang/Thread.html#stop()

final de vacío sincronizada final público (desechable arrojadizo)

Desde: API Nivel 1 Este método está en desuso. porque detener un hilo de esta manera no es seguro y puede dejar su aplicación y la máquina virtual en un estado impredecible.

Throws UnsupportedOperationException. NullPointerException si throwable() es nula

Si desea estás rosca a la fuerza dejado de utilizar en su lugar mientras threadName.interrupt() externo al hilo. Programe de forma natural su ciclo de vida de subprocesos para que se detenga naturalmente cuando se complete la tarea.

En su ejemplo, simplemente puede eliminar el comando stop() ya que el hilo cesará naturalmente la ejecución al final de su método run().

EDITARfinish() es una llamada a su Activity para terminar, no su Thread. En el ejemplo anterior, el Thread saldría naturalmente de todos modos, pero no se debe confundir con detener Thread y terminar un Activity ya que son cosas muy diferentes.

Cuestiones relacionadas