Ich habe mich nach einem Weg um Picasso in einem separaten Thread zu suchen, wie es aus dem Internet geladen wird. Ich habe keine Ahnung, wie ich das bestätigen kann.Picasso Image Wird in Multithread geladen?
Meine App ist im Grunde ein ListView mit einem imageView und zwei textViews und ich habe einen CustomAdapter erstellt, der BaseAdapter erweitert, um die Liste zu unterstützen. Dies ist, was ich in meiner Adapter-Klasse getan habe:
public class CustomAdapter extends BaseAdapter
{
public String title[];
public String description[];
public String images[]; //Image URLs
private static Picasso instance;
public Activity context;
public LayoutInflater inflater;
public CustomAdapter(Activity context, String[] title, String[] description, String[] images) {
super();
this.context = context;
this.title = title;
this.description = description;
this.images = images;
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return title.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public static Picasso getSharedInstance(Context context)
{
if(instance == null)
{
instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
return instance;
}
else
{
return instance;
}
}
public static class ViewHolder
{
ImageView icon;
TextView itemNameTextView;
TextView itemDescriptionTextView;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
Debug.startMethodTracing("ThreadCheck");
ViewHolder holder;
if(view==null)
{
holder = new ViewHolder();
view = inflater.inflate(R.layout.list_item, null);
holder.icon = (ImageView) view.findViewById(R.id.DownloadedImage);
holder.itemNameTextView = (TextView) view.findViewById(R.id.ItemNameTextView);
holder.itemDescriptionTextView = (TextView) view.findViewById(R.id.ItemDescriptionTextView);
view.setTag(holder);
}
else
holder=(ViewHolder)view.getTag();
Picasso.with(context).load(images[position]).into(holder.icon);
holder.itemNameTextView.setText(title[position]);
holder.itemDescriptionTextView.setText(description[position]);
return view;
}
}
Was ich wissen wollte, war:
1) Hat der folgende macht Picasso das Bild in einem separaten Thread zu laden? (Ich las diese irgendwo und es nicht wirklich Sinn für mich und ich hoffe, ihr es mir erklären würden.)
instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
2) Oder habe
Picasso.with(context).load(images[position]).into(holder.icon);
automatisch tun es in einem neuen Thread?
3) Oder tut es keiner von denen in einem neuen Thread und ich muss es separat machen? Wenn ja, wie?
Vielen Dank im Voraus!
'Picasso' lädt Bilder aus dem Internet in einem Hintergrund-Thread standardmäßig herunter. Was möchtest du bestätigen? –
Ja, es wird ein separater Thread anstelle des UI-Threads zum Laden von Bildern verwendet. – anhtuannd
Picasso Downloads in einem Hintergrund-Thread, sowohl mit Standard-Kontext und mit einem Builder ... Sie werden nie eine NetworkOnMainThreadException .. – Kushan