2016-01-20 125 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時無法加載圖像的問題,但是如果它沒有發佈堆棧跟蹤,我們可以嘗試解決這個問題。