Android从URL加载图像

问题描述:

我使用universal image loader库从URL加载约50图像到listview。 这是binder数据。Android从URL加载图像

public class BinderDataImg extends BaseAdapter { 
    static final String KEY_IMG = "img"; 
    LayoutInflater inflater; 
    List<HashMap<String,String>> imgHashmap; 
    ViewHolder holder; 
    public BinderDataImg() { 
     // TODO Auto-generated constructor stub 
    } 
    public BinderDataImg(Activity act, List<HashMap<String,String>> map) { 
     this.imgHashmap = map; 
     inflater = (LayoutInflater) act 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return imgHashmap.size(); 
    } 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null){ 
      vi = inflater.inflate(R.layout.list_img, null); 
      holder = new ViewHolder(); 
      holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg); 
      vi.setTag(holder); 
     } 
     else{ 
      holder = (ViewHolder)vi.getTag(); 
     } 
     String uri = imgHashmap .get(position).get(KEY_IMG); 
     ImageLoader imageLoader = ImageLoader.getInstance(); 
     DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
       .cacheOnDisc(true).resetViewBeforeLoading(true).build(); 
     imageLoader.displayImage(uri, holder.iv_img, options); 
     return vi; 
    } 
    static class ViewHolder{ 
     ImageView iv_img; 
    } 
} 

活动。

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      .cacheOnDisc(true).cacheInMemory(true) 
      .imageScaleType(ImageScaleType.EXACTLY) 
      .displayer(new FadeInBitmapDisplayer(300)).build(); 

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
      getApplicationContext()) 
      .defaultDisplayImageOptions(defaultOptions) 
      .memoryCache(new WeakMemoryCache()) 
      .discCacheSize(100 * 1024 * 1024).build(); 

    ImageLoader.getInstance().init(config); 

差不多,但并不是所有的图像加载和logcat中有一个OutOfMemoryError。 这怎么解决?

更新:

这是Binderdata从Picasso库。

public class BinderDataImg extends BaseAdapter { 
    static final String KEY_IMG = "img"; 
    LayoutInflater inflater; 
    List<HashMap<String,String>> imgHashmap; 
    ViewHolder holder; 
    public BinderDataImg() { 
     // TODO Auto-generated constructor stub 
    } 
    Activity act; 
    public BinderDataImg(Activity act, List<HashMap<String,String>> map) { 
     this.imgHashmap = map; 
     inflater = (LayoutInflater) act 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       this.act = act; 
    } 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return imgHashmap.size(); 
    } 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null){ 
      vi = inflater.inflate(R.layout.list_img, null); 
      holder = new ViewHolder(); 
      holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg); 
      vi.setTag(holder); 
     } 
     else{ 
      holder = (ViewHolder)vi.getTag(); 
     } 
     String uri = imgHashmap .get(position).get(KEY_IMG); 
     Picasso.with(act).load(uri).into(holder.iv_img); 
     return vi; 
    } 
    static class ViewHolder{ 
     ImageView iv_img; 
    } 
} 

这会加载图像确定,但向上或向下滚动图像时会再次加载。

+0

可以使用毕加索库this.Its更容易使用和优化,以及,这需要缓存和内存的护理 –

+0

当我用毕加索库,图像重载滚动时上或下 。所以我尝试通用图像加载器库,我没有与毕加索图书馆相同的问题,但我得到这个问题 – abcd1234

+0

毕加索缓存图像,所以他们不应该重新下载。如果他们然后是有代码逻辑 –

确定这里是用毕加索和我实现的代码为我工作顺利

public class MyFragmentAdapter extends ArrayAdapter<Video> { 
    private Context mContext; 
    private LayoutInflater mInflater; 
    private Bitmap mBitmap; 

    public MyFragmentAdapter(Context context, int resource, List<Video> objects) { 
     super(context, resource, objects); 
     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.mContext = context; 
    } 


    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(
        R.layout.item_gallery, null); 
      holder.imageview = (ImageView) convertView.findViewById(R.id.iv_thumbImage); 
      holder.pb = (ProgressBar) convertView.findViewById(R.id.iv_progressbar); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.pb.setVisibility(View.VISIBLE); 
     String url="Url here"; 
      Picasso.with(mContext).load(thumbnail_path).placeholder(R.drawable.icon_video).into(holder.imageview, new Callback() { 
       @Override 
       public void onSuccess() { 
        holder.pb.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onError() { 
        holder.pb.setVisibility(View.INVISIBLE); 
       } 
      }); 
     } 
     return convertView; 
    } 

    public static class ViewHolder { 
     ImageView imageview; 
     ProgressBar pb; 
    } 
} 
+0

我发布了错误的代码。我再次更新我的代码。对不起, – abcd1234

+0

你为什么使用散列表?你为什么不用简单的List? –

+0

新的ImageDownloader(holder.iv_hinh).execute(uri);没有在我的代码中。对不起 – abcd1234

在找到这个非常简单和容易的解决方案,这就是为什么建议你。 在您的适配器中,您可以使用此代码下载图像并在视图中显示。

Picasso.with(mContext).load(url).into(mImageView); 

下一次当您滚动时,图像将从缓存加载,并且不会花费太多时间再次加载。

在你的应用程序级的build.gradle

compile 'com.squareup.picasso:picasso:2.5.2' 

如果要附加进度条,每个viewholder那么你可以使用:

Picasso.with(mContext).load(url).into(target); 

Target target = new Target() { 
     @Override 
     public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      holder.mImageView.setImageBitmap(bitmap); 
      holder.mProgressBar.setVisibility(View.INVISIBLE); 
     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 

     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 

     } 
    }; 
+0

我是毕加索libarary的更新代码。图片将在向上或向下滚动时重新加载 – abcd1234

+0

它将从缓存中重新加载,但不会再次下载,并且不需要太多时间来重新加载。如果花费很长时间加载,那么您是否可以发送适配器的代码? –

+0

我在我的帖子中更新了代码 – abcd1234

尝试用Aquery图像加载lib,这对我工作

public class CustomAdapterAccept extends BaseAdapter { 

     private Context context; 
     private ArrayList<HashMap<String,String>> listData; 


     private static final String TAG_NAME="brandname"; 
     private static final String TAG_IMAGE="brandimg"; 
     public CustomAdapterAccept(Context context,ArrayList<HashMap<String,String>> listData) { 
      this.context = context; 
      this.listData=listData; 
      aQuery = new AQuery(this.context); 
     } 

     @Override 
     public int getCount() { 
      return listData.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return listData.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = LayoutInflater.from(context).inflate(R.layout.list_item_cat, null); 
       holder.propic = (ImageView) convertView.findViewById(R.id.brndimage); 
       holder.txtproname = (TextView) convertView.findViewById(R.id.txtcatname); 


       convertView.setTag(holder); 
      }else{ 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.txtproname.setText(listData.get(position).get(TAG_NAME)); 

      aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE), true, true, 0, R.drawable.ic_launcher); 


      aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE),true,true,0,R.drawable.ic_launcher); 

      // image parameter : 1 : memory cache,2:file cache,3:target width,4:fallback image 
      return convertView; 
     } 
     class ViewHolder{ 
      ImageView propic; 
      TextView txtproname; 
      TextView txtproid; 
      TextView txtprofilecast; 
      TextView txtprofileage; 
      TextView txtprofileplace; 
     } 

    } 

更多看到this

+0

它不适合我。 – abcd1234

+0

你有错误吗? –

+0

yeas,仍OutOfMemoryError – abcd1234