2016-01-20 124 views
0

我正在建立一个文件资源管理器应用程序,我试图加载大量的图像(超过5000 ...),我试图使用毕加索,但它仍然很慢所以我试图加载Thumbimage与毕加索,而不是整个图像文件..加载位图与毕加索到ImageView

.... 
    ImageItem item = data.get(position); 
    ImageView imageView = holder.image; 
    Bitmap ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(item.getImage().getPath()), 100, 100); 
    Picasso.with (context) .load (ThumbImage) .into (imageView); /*/ doesnt work.. cant load ThumbImage with Picasso 
    Picasso.with (context) .load (item.getImage()) .into (imageView); //work, but too slow 

我无法弄清楚如何我可以加载到Thumbimage与ImageView的毕加索..有什么,为什么这样做呢?另一种加载速度更快的图像?

+0

是你的图像吗? – Tasos

+0

是的,从相机(DCIM文件夹) – Nirel

+0

那么你仍然会有性能问题。最好创建另一个应用程序,从相机文件夹获取所有图像,并为它们创建拇指,以便您拥有2张图像。小的和大的。然后在您正在使用的应用程序中加载来自相机文件夹的小部分。或将2合并为一个应用程序,但我建议在相机文件夹中永久创建所有图像的拇指。 – Tasos

回答

1

首先我会推荐使用RecyclerView而不是GridView,因为它可以为您处理大量的内存管理。无需一次加载所有图像(或自己管理),它只会加载适合屏幕的图像。您可以使用GridLayoutManager使它看起来就像在GridView中一样。

RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler); 
recyclerView.setLayoutManager(new GridLayoutManager(context, 4); 
recyclerView.setAdapter(new MyRecyclerViewAdapter(context, data); 

而且,让毕加索手柄转换图像为你,这样你就不需要使用ThumbnailUtils。毕加索处理图像大小调整和内存管理与resize()功能:

String uri = data.get(position); 

Picasso.with(context).load(new File(uri)).resize(100, 100) 
    .centerCrop().into(imageView) 

可以在RecyclerView.AdapteronBindViewHolder()方法做到这一点,这样当View必须要显示的每个图像将只被加载。

我不知道你是如何目前获得的图像,但如果你不知道如何获取图像的URI,这应该工作:

String[] projection = {"*"}; 

List<String> data = new ArrayList<>(); 

Cursor cursor = context.getContentResolver().query(
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); 

if(cursor.moveToFirst()) { 
    do { 
     data.add(cursor.getString(cursor 
         .getColumnIndex(MediaStore.Images.Media.DATA))); 
    } while(cursor.moveToNext()); 
} 

我不知道这将解决您在使用Picasso时无法加载图像的问题,但是如果它没有发布堆栈跟踪,我们可以尝试解决这个问题。