2011-05-14 53 views
5

Quiero abrir una nueva actividad:iniciar nueva Actividad Android es tan lento

Intent intent = new Intent(homeScreen.this, EmployeeService.class);   
Bundle b = new Bundle(); 
b.putInt(Constants.SERVICE_DETAIL_L1_ID_MSG, ServiceIndex.SRV_L1_EMPLOYMENT); 
b.putInt(Constants.SERVICE_DETAIL_FOCUS_POS_MSG, 2); 
intent.putExtras(b); 
startActivity(intent); 

pero se necesita mucho tiempo para que la actividad de destino (EmployeeService) se hacen visibles. De Logcat, veo:

05-14 23:43:31.727: INFO/ActivityManager(59): Displayed activity fr.playsoft.happylille/.employee.EmployeeService: 7050 ms (total 7050 ms) 

No puedo creer que lleve más de 7 segundos abrir una nueva actividad. Agrego un inicio de sesión en Crear() pero veo que solo lleva 5 ms terminar en Crear.

¿Alguien me puede decir cómo encontrar la raíz de este problema?

+0

OK. Yo se porque. Porque en Activity objetivo, configuro tvDesc.setText (Html.fromHtml (desc)); con desc es el contenido de una página web larga con etiqueta HTML. ¡La página HTML de proceso con etiqueta no compatible puede hacer que mi actividad se muestre lentamente! – anticafe

+0

Puede poner el procesamiento en una secuencia separada. – olafure

+0

@Olafure: es una muy buena idea. Ahora funciona bien – anticafe

Respuesta

3

Debería mover el código Html.fromHtml(desc); a una secuencia para que sea asincrónico. Este hilo se puede iniciar de manera segura durante el onCreate() del recién abierto Activity.

Al final de ese hilo, puede ejecutar tvDesc.setText() desde el subproceso de interfaz de usuario:

class ExampleThread extends Thread { 
    @Override 
    public void run() { 
     final Spanned spannedText = Html.fromHtml(desc); 

     yourNewlyOpenedActivity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        tvDesc.setText(spannedText); 
       } 
     }); 
    } 
} 

En términos más generales, 7 segundos en un dispositivo significa que tal vez 20 en otro, por lo beware the ANR!

(Editado más al comentario Boy 's adelante, la antigua versión de esta pregunta ya no precisa/válido)

+0

No creo que se te permita hacer 'setText' en un hilo que no sea UI – Boy

+0

@Boy Cuando escribí esto, estaba en el nivel 8 de API. Estaba funcionando pero no volví a probar desde entonces (no es necesario)) Entonces, no puedo garantizar que esto siga siendo válido, ¿lo intentaron? – Shlublu

+0

No volví a hacer la prueba, porque estaba bastante seguro. Pero acabo de hacerlo y voy a publicar una nueva respuesta, el texto sería demasiado largo aquí – Boy

0

tu nuevo código de actividad abierto puesto en Subproceso. y ejecutar el código puede ser menos tiempo para que se requiera abrir otra actividad ... puede ser útil.

1

Shlublu's answer es incorrecta, no se le permite hacer cambios de interfaz de usuario de la interfaz de usuario hilos no!

Parece que funciona al principio, pero eso es solo suerte, el tiempo.

solo una prueba fea rápida prueba que va a salir mal en el momento "correcto". Aquí configuro un texto cada 100 ms. Se colgará en aproximadamente 1 segundo:

 new Thread() { 

     @Override 
     public void run() { 
      while (true) { 
       someTextView.setText("bla"); 

       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }.start(); 

Se lanzará este error: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

creo que debe ejecutar el Html.fromHtml(desc) a través de un AsyncTask o RxJava

Cuestiones relacionadas