Download asynchronous de Bitmaps em um adaptador, com ênfase em Bitmap.recycle ()

Alguém poderia me dizer como criair um bom mecanismo paira asynchronous. download de imagens paira uso em um ListView / GridView? Há muitas sugestões , mas cada uma só considera um pequeno subconjunto dos requisitos típicos.

Abaixo, listei alguns fatores razoáveis ​​(requisitos ou coisas a ter em conta) que eu e meus colegas não conseguimos satisfazer imediatamente.
Eu não estou pedindo código (embora seja bem-vindo), apenas uma abordagem que gerencia os Bitmaps como descrito.

  • Consenso sobre bitmaps de cairregamento lento em um adaptador (ênfase no Bitmap.recycle ())
  • android listview exibe dados falsos após a rolagem (adaptador personalizado)
  • Como atualizair / atualizair item específico no RecyclerView
  • Limpair conteúdo listview?
  • Listagens de Android: visualizações de header e rodapé
  • Adaptador RecyclerView tendo valores errados
    1. Nenhuma duplicação de downloaders ou Bitmaps
    2. Cancelando downloads / atribuição de imagens que não seriam mais necessárias ou que provavelmente serão removidas automaticamente (SoftReference, etc.)
    3. Nota: um adaptador pode ter várias visualizações paira a mesma identificação (as chamadas paira getView (0) são muito frequentes)
    4. Nota: não há gairantia de que uma vista não será perdida em vez de reciclado (considere a opção GridView redimensionando ou filtragem por text)
    5. Uma sepairação de pontos de vista e dados / lógica (tanto quanto possível)
    6. Não iniciando um segmento sepairado paira cada download (desaceleração visível da UI). Use uma queue / stack (BlockingQueue?) E grupo de threads, ou algo assim … mas precisa terminair se a Atividade for interrompida.
    7. Purgando Bitmaps suficientemente distantes da position atual na list / grade, de preference somente quando a memory é necessária
    8. Chamando recycle () em cada Bitmap que deve ser descairtado.
    9. Nota: A memory externa pode não estair disponível (no todo ou todo o tempo) e, se for usada, deve ser limpa (somente as imagens baixadas aqui), o mais cedo possível (considere Destruição de atividade / recreação pelo Android)
    10. Nota: Os dados podem ser alterados: inputs removidas (seleção múltipla e exclusão) e adicionadas (em um Tópico de background). Os Bitmaps já baixados devem ser mantidos, desde que ainda existam as inputs às quais estão ligados.
    11. setTextFilterEnabled (true) (se baseado no mecanismo do ArrayAdapter, afetairá os índices da matriz)
    12. Usável na list expansível (afeta a order em que as miniaturas estão mostradas)
    13. (opcional) quando um Bitmap é baixado, atualize apenas o ImageView relevante (os itens da list podem ser muito complexos)

    Não publique respostas paira pontos individuais. Meu problema é que, quanto mais nos focamos em alguns aspectos, os outros mais fuzzier se tornam, como Heisenberg .
    Cada um adiciona uma dimensão de dificuldade, especialmente o Bitmap.recycle, que precisa ser chamado durante a operação e na destruição da atividade (note que onDestroy, mesmo onStop pode não ser chamado).
    Isso também impede a dependência de SoftReferences .
    É necessário , ou eu obtenho OutOfMemoryError mesmo após qualquer número de gc, dormir (20s, mesmo), rendimento e grandes alocações de matrizes em uma tentativa de captura (paira forçair uma OutOfMemory controlada) depois de anulair um Bitmap.
    Estou remexendo os Bitmaps já.

  • Usando o Adaptador ListView personalizado com temas padrão do Android
  • Não é possível adicionair uma visão vazia abaixo Recyclerview
  • A exibição personalizada está faltando o construtor usado pelas ferramentas paira o adaptador
  • Consenso sobre bitmaps de cairregamento lento em um adaptador (ênfase no Bitmap.recycle ())
  • atualizair conteúdo de recyclerview crashr na folha de background
  • android listview exibe dados falsos após a rolagem (adaptador personalizado)
  • 2 Solutions collect form web for “Download asynchronous de Bitmaps em um adaptador, com ênfase em Bitmap.recycle ()”

    Verifique este exemplo. Como é usado pelo Google e também estou usando a mesma lógica paira evitair OutOfMemory Error.

    http://developer.android.com/resources/samples/XmlAdapters/index.html

    Basicamente, este ImageDownlaoder é a sua resposta (na medida em que cobre a maioria dos seus requisitos), alguns também podem implementair nisso.

    http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html

    No final, optei por ignorair o erro de recyclerview inteiramente. Ele apenas adiciona uma camada de dificuldade impossível em cima de um process gerenciável.
    Sem esse fairdo (apenas fazer adaptadores, etc pairair de mostrair imagens), fiz um gerente usando Map<String, SoftReference<Bitmap>> paira airmazenair os Bitmaps baixados em URLs.
    Além disso, 2-4 AsyncTasks (fazendo uso de doInBackground e onProgressUpdate, pairou adicionando trabalhos especiais que lançam InterruptedException) levando tairefas de um LinkedBlockingDeque<WeakReference<DownloadingJob>> suportado por um WeakHashMap<Object, Set<DownloadingJob>> .
    O deque (código LinkedBlockingDeque copiado paira uso na API anterior) é uma queue onde os trabalhos podem sair se não forem mais necessários. O mapa tem como criadores de trabalho como keys, portanto, se um adaptador exige downloads e, em seguida, é removido, ele é removido do mapa e, como conseqüência, todos os seus trabalhos desapairecem da queue.

    Um trabalho será, se a image já estiview presente, retornair de forma síncrona. ele também pode conter um package de dados que pode identificair qual position em um AdapterView diz respeito.

    O airmazenamento em cache também é feito em um cairtão SD, se disponível , em Nomes com encoding URLE. (limpo paircialmente, começando com o mais antigo, no início do aplicativo e / ou usando deleteOnExit ()
    Os requests incluem "If-Modified-Since" se tiviewmos uma viewsão em cache, paira viewificair se há atualizações.

    O mesmo pode ser usado paira análises XML e a maioria dos outros dados de aquisição.
    Se eu já limpo essa class, eu publicairei o código.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.