Pergunta

Eu tenho tentado otimizar meu aplicativo de thread único, que carrega um monte de ladrilhos que maquiagem um grande bitmap. O aplicativo estava se tornando muito lento quando carregava os novos ladrilhos na memória do sistema. Agora estou procurando tentando usar tarefas assíncronas para esse fim. O aplicativo detecta que o ladrilho está no canto superior esquerdo em um método chamado OnDraw, cria uma string que contém o caminho do bitmap na pasta Ativos e depois verifica se o bitmap é nulo antes de desenhar. Se for nulo, ele o carregará na memória. Minha idéia era processar o bitmap no Dowbackground e no gatilho postExecute uma visualização invalidar para exibir o bitmap carregado de assíncrono. Algumas perguntas:

1.) Posso executar minha tarefa assíncrona para cada bitmap? (Esta afirmação: New MyAsyncTaskManager (). Execute (Bitmappath); se não, qual é a melhor maneira de fazer isso, já que a única coisa que async fará é apenas carregar bitmaps na memória?

2.) É possível definir a prioridade AsyncTask se os bitmaps carregarem muito lentamente?

3.) Existe uma maneira melhor de fazer isso? Tenho certeza de que é o carregamento do bitmap, e não o desenho de tela que diminui o aplicativo.

Meu código assíncrono temporário:

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();
}
}
Foi útil?

Solução

Adicionando uma nova resposta à sua pergunta completamente nova :)

  1. Depende da quantidade de bitmaps. Quantos você tem? Você não quer criar dezenas de threads. Afinal, você tem apenas um núcleo no seu hardware, portanto, ter vários threads não comprará nada - a troca de contexto apenas o abafou. Se você tiver toneladas de bitmaps, convém ter uma fila de bitmaps e trabalhar com isso. Para isso, um fio e um manipulador seriam realmente melhores.

  2. Isso é. Geralmente, defino os threads do trabalhador um nível de prioridade menor que o encadeamento principal.

Outras dicas

Espere, você está chamando o BitmapLoaderThread.run ()? É meio difícil descobrir o que está acontecendo, porque esses são trechos de código sem contexto (em que tópico é algo que está sendo executado? Que função?), Mas você não chama Run () - esse é o trabalho do sistema operacional! Para iniciar um novo thread, você chama Start () - Isso criará o novo thread e chamará sua função run (). Se você ligar para o Run diretamente, ainda está chamando em seu próprio tópico!

Fora isso - como você faz o aperto de mão entre os dois threads? Como o tópico do trabalhador informa ao encadeamento principal que o bitmap é carregado? Você pode usar um manipulador para isso, ou pode usar uma tarefa de assíncrogem em vez do encadeamento completamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top