Android Picasso:Não Carregar no Fragmento
-
21-12-2019 - |
Pergunta
Eu estou dando um Picasso tentar por algum mais fácil o gerenciamento de memória com as imagens.Acabei de tentar implementá-lo dentro do meu fragmento no entanto, eu não consigo fazê-lo funcionar.
mainLayout.setBackground(new BitmapDrawable(getResources(), Picasso.with(mainLayout.getContext()).load(R.drawable.background2).get()));
Onde layoutprincipal é um LinearLayout.Eu também tentei isso:
Picasso.with(getActivity().getApplicationContext()).load(R.drawable.background2).into(imageView1);
Eu tentei Picasso.com(este)...mas isso não funciona em todos.
Continuo a receber uma Exceção de:
java.lang.IllegalStateException: Method call should not happen from the main thread.
at com.squareup.picasso.Utils.checkNotMain(Utils.java:71)
at com.squareup.picasso.RequestCreator.get(RequestCreator.java:206)
at ...
onde eu o chamava.
Qualquer pessoa experimentar isso ou sabe como usar isso corretamente com fragmentos?
Solução
A exceção estados de mensagem é bastante clara.A .get() mensagem não é assíncrona, portanto, vai fazer o trabalho (de rede, leitura de arquivo,...seja o que for) no thread principal, que você deve evitar, sempre que possível.
O seu código para definir a imagem para uma imageView parece correto, para mim, ainda.
Eu acho que também é possível fazer o mesmo com o layoutprincipal (Picasso, em seguida, irá definir o drawable/Bitmap para o plano de fundo automaticamente).Se estou errado, aqui, ter um olhar para o Target.class que vem com Picasso.Você pode carregar a imagem em um alvo, que deve fornecer processadores para o sucesso e o erro.No sucesso manipulador, você vai obter o mapa de bits, uma vez que é carregado e pode configurá-lo para o seu bakground.
Existem algumas soluções, o que pode funcionar no seu caso.
[EDITAR]
Quando utilizar o Método get (), fornecido por Picasso o carregamento terá lugar no segmento que você está trabalhando no momento, o que é claramente indicado nas fontes:https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/RequestCreator.java
/** Síncrona cumprir este pedido.Não deve ser chamado de thread principal.*/
público Bitmap get() throws IOException {[...]}
No seu caso eu usaria o Destino de interface, que oferece chamadas de retorno quando a imagem é carregada.
Picasso.with(getActivity()).load(R.drawable.background2).into(new Target(){
@Override
public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) {
mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap));
}
@Override
public void onBitmapFailed(final Drawable errorDrawable) {
Log.d("TAG", "FAILED");
}
@Override
public void onPrepareLoad(final Drawable placeHolderDrawable) {
Log.d("TAG", "Prepare Load");
}
});
Como você está usando um recurso interno aqui, porque não basta fazer o seguinte?
mainLayout.setBackgroundResource(R.drawable.background2);
Espero que isso ajude.
Matéria
Outras dicas
Tente isso
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.imageview = (ImageView) v.findViewById(R.id.news_img);
holder.tvName = (TextView) v.findViewById(R.id.news_title);
holder.tvDate = (TextView) v.findViewById(R.id.news_time);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder = (ViewHolder )v.getTag();
Picasso.with(context).load(postList.get(position).getThumbnail()).into(holder.imageview);
holder.tvName.setText(postList.get(position).getTitle());
holder.tvDate.setText(postList.get(position).getDate());
return v;
}