Pregunta

He estado tratando de optimizar mi aplicación solo hilo que carga un montón de fichas que el maquillaje un gran mapa de bits. La aplicación fue volviendo muy lento cuando se cargaría los azulejos nuevos en la memoria del sistema. Im ahora mirando tratando de utilizar las tareas asíncronas para este propósito. Las aplicaciones, que detecta baldosas se encuentra en la parte superior izquierda en un método llamado por onDraw, crea una cadena que contiene la ruta del mapa de bits en la carpeta Activos y, a continuación, comprueba si el mapa de bits es nulo antes de dibujo. Si es nulo, se carga en la memoria. Mi idea era procesar el mapa de bits en DoBackground, y en postExecute desencadenar una vista invalidate para visualizar el mapa de bits cargado asíncrono. Algunas preguntas:

1.) ¿Puedo ejecutar mi tarea asíncrono para cada mapa de bits? . (Esta declaración:? Nueva myAsyncTaskManager () ejecutar (bitmapPath); si no, ¿cuál es la mejor manera de hacerlo ya que lo único asíncrono hará es sólo mapas de bits de carga en la memoria

2.) ¿Es posible establecer el AsyncTask prioridad si los mapas de bits se cargan demasiado lento?

3.) ¿Hay una mejor manera de hacer esto? im seguro de que es la carga de mapa de bits, y no el lienzo de dibujo que ralentiza la aplicación.

Mi código asíncrono temporal:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}
¿Fue útil?

Solución

Añadir una nueva respuesta a su completamente nueva pregunta:)

  1. Depende de la cantidad de mapas de bits. ¿Cuantos tienes? Usted no desea crear decenas de hilos. Después de todo, sólo tiene un núcleo de su hardware, por lo que tener múltiples hilos no se va a comprar cualquier cosa - el cambio de contexto acaba de ahogar a cabo. Si usted tiene toneladas de mapas de bits, es posible que desee tener una cola de mapas de bits y el trabajo a través de él. Por eso, un hilo y Handler en realidad sería mejor.

  2. Es. Generalmente, I conjunto subprocesos de trabajo nivel de prioridad más bajo que el hilo principal.

Otros consejos

Espera, que está llamando bitmapLoaderThread.run ()? Es un poco difícil de entender lo que está pasando, porque estos son fragmentos de código con ningún contexto (lo que el hilo es algo que se ejecuta en qué función??), Pero no se llaman run () - que es el trabajo del sistema operativo! Para iniciar un nuevo hilo, se llama a start () - esto creará el nuevo hilo y llamar a su función run (). Si se llama a ejecutar directamente, todavía estás llamando en su propio hilo!

Aparte de eso - ¿Cómo se hace el apretón de manos entre los dos hilos? ¿Cómo funciona el subproceso de trabajo dice que el hilo principal que se carga el mapa de bits? Se puede utilizar un controlador para que, o se puede utilizar un AsyncTask en lugar de la rosca por completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top