在适配器内进行一些网络操作



我正在开发一个用于Android的应用程序,我在该应用程序上有一个显示某些用户的listView。因此,我想在此列表视图中显示他们的图片,因此我确实如下:

private class StableArrayAdapter extends ArrayAdapter<Request>{
    private Context context;
    private Bitmap tempobmp;
    private List<User> mylist;
    public StableArrayAdapter(Context context,List<User> mylist){
        super(context, R.layout.request_layout, mylist);
        this.context = context;
        this.mylist = mylist;
    }
    public class ViewHolder{
        public ImageView image;
      }
    public View getView(int position,View convertView,ViewGroup parent){
        View vi = convertView;
        if(vi==null){
            ViewHolder holder = new ViewHolder()
            holder.image = (ImageView) vi.findViewById(R.id.requestImage);
        }
        final ViewHolder holder = (ViewHolder) vi.getTag();
        User s = mylist.get(position);
        try{
            final URL url = new URL(myapp.getUser().getPhoto().getS3Url());
            Thread thread = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      try{
                        InputStream is = (InputStream) url.getContent();
                        Bitmap bmp = BitmapFactory.decodeStream(is);
                        tempobmp=bmp;
                      }
                      catch(Exception e){
                          Log.d("eeeeA52","eeeeA52"+e);
                      }
                  }
            });
            thread.start(); 
            thread.wait();
        }
        catch(Exception e){
            Log.d("eeeeAF","eeeeAF"+e);
        }
        holder.image.setImageBitmap(tempobmp);
      return vi;
    }

我可以放入线程的所有日志都告诉我,从数据库中获取位图没有问题,但是当我使用此listView启动页面时,图像仍然是默认图像。是否可以在适配器中使用线程来检索网络数据?如果是,哪个是最好的做法?

谢谢你们:)

通常,直接从适配器中进行网络调用是一个坏主意。但是,如果您实际上无法在填充ListView之前在活动/片段中执行下载,则可以使用许多执行此操作的库之一,例如具有NetworkImageView对象的Volley。或者,您可以使用专门为从网络下载图像的毕加索库,并在常规ImageView

中显示

两者都有据可查且易于使用。(毕加索需要1行代码)

最新更新