As bibliotecas de carregamento de imagens são utilizadas em praticamente todos os projetos Android. Elas facilitam o carregamento de imagens a partir de diversas fontes como: web, sistema de arquivos e até de banco de dados. Possuem recursos de redimensionamento, crop, placeholder, animação, etc. As mais famosas desse segmento são: Picasso, Glide e Universal Image Loader (UIL). Todas são ótimas, já resolvi uns problemas com uma, outros problemas com outra e por aí vai.
No projeto que estou atualmente estou usando o Picasso, e estava precisando carregar imagens de um local não suportado nativamente por ele: o arquivo de expansão de APK.
Graças ao grande mestre Jake Wharton, podemos implementar isso de uma forma muito fácil. Basta criar uma subclasse de RequestHandler.
import com.squareup.picasso.Request; import com.squareup.picasso.RequestHandler; public class MeuRequestHandler extends RequestHandler { public MeuRequestHandler() { } @Override public boolean canHandleRequest(Request data) { // Retorne true se essa classe pode tratar a leitura da imagem return data != null && data.uri != null && data.uri.getScheme() != null && data.uri.getScheme().startsWith("ngvl"); } @Override public Result load(Request request, int networkPolicy) throws IOException { Bitmap imagem = metodoQueCarregaSeuBitmap(request.uri); Result result = new Result(imagem, Picasso.LoadedFrom.DISK); return result; } }Essa classe possui apenas dois métodos:
- canHandleRequest(Request) define se essa classe é capaz de carregar uma determinada imagem. Nesse exemplo, estou usando o parâmetro Request para checar se o endereço (definido por uma Uri) começa com "ngvl".
- Já o método load(Request, int) carrega a imagem em si e a retorna por meio de um objeto Result, que recebe o Bitmap da imagem e de onde ela foi carregada (memória, disco ou rede).
Picasso = mPicassoInstance = new Picasso.Builder(mContext.getApplicationContext()) .addRequestHandler(new MeuRequestHandler()) .build();Com isso, você está adicionando uma nova fonte de imagens à sua instância do Picasso, ou seja, você pode usar todos os schemas já suportados pelo Picasso (http, file, content, ...) e esse que acabamos de criar.
Agora, se invocarmos o código a seguir, o nosso handler tratará essa requisição.
mPicassoInstance .load("ngvl://minhaimagem/logo.jpg") .into(imageView);
#perfmatters #protip É importante que só haja uma instância desse objeto para evitar problemas de memória! Sendo assim, implemente um Singleton, e caso precise de um Context, passe o getApplicationContext() para ele ;)
4br4ç05,
nglauber