2015-01-01 26 views
16

Tôi đang cố hiển thị tin tức của mình trong một tùy chỉnh ListView. Mỗi tin tức được bao gồm một số hình ảnh và tôi muốnTải xuống và lưu hình ảnh bằng Picasso

1.download hình ảnh từ máy chủ

2.save trong lưu trữ địa phương

3.save đường của hình ảnh vào SQLite

4.show hình ảnh trong ListView sử dụng bộ điều hợp tùy chỉnh của tôi.

Tôi chỉ gặp sự cố với các bước & . Tôi có thể lấy tin tức từ máy chủ và hiển thị chúng trong ListView của tôi

và hiển thị hình ảnh từ bộ nhớ cache bằng cách thêm vào dưới đây mã trong bộ chuyển đổi của tôi:

Picasso.with(context).load(image[position]).into(iv); 

Bằng cách sử dụng Picasso.with(context).load(image[position]).into(target), chỉ cần tôi có thể tiết kiệm một

image trong bộ nhớ.

Xin gợi ý cho tôi ý tưởng của bạn ...

CẬP NHẬT: Khi tôi sử dụng bên dưới mã, chỉ là một hình ảnh (chỉ số cuối của mảng hình ảnh của tôi) đang được lưu!

Làm cách nào để lưu tất cả hình ảnh trong mảng bằng mã này ?!

@Override 
protected void onPostExecute(Void result) { 
    SaveImages(); 
    pDialog.dismiss(); 
    super.onPostExecute(result); 
} 

String fileName = null; 

public void SaveImages() { 
    for(int i = 0; i < image.length; i++) { 
     Picasso.with(this).load(image[i]).into(target); 
     fileName = "image-" + i + ".jpg"; 
    } 
} 

Target target = new Target() { 

    @Override 
    public void onPrepareLoad(Drawable arg0) { 
    } 

    @Override 
    public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) { 
     File file = new File(Environment.getExternalStorageDirectory().getPath() +"/" + fileName); 
     try { 
      file.createNewFile(); 
      FileOutputStream ostream = new FileOutputStream(file); 
      bitmap.compress(CompressFormat.JPEG, 75, ostream); 
      ostream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onBitmapFailed(Drawable arg0) { 
    } 
}; 
+0

bạn có thể sử dụng trình tải hình ảnh phổ thông hoặc bộ tải hình ảnh chung thay thế. –

+0

hãy xem câu trả lời này http://stackoverflow.com/a/27720638/1576416 –

+0

@ chet's, tôi đã tải xuống Thư viện UIL, nhưng tôi cũng không thể giải quyết được vấn đề của mình với nó! Bạn có thể vui lòng cho tôi mã đơn giản không? –

Trả lời

7

Cố gắng đặt định nghĩa "Target target" trước "Picasso.with (this) .load (image [i]). Into (target);".

P.S. Ở đây tôi sử dụng mã này và lưu hình ảnh tốt. Dù sao cũng cảm ơn bạn.

Mã của tôi:

 final String fileName = mDataset.get(i).getAid() + ".jpg"; 
     Target target = new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
       return; 
      } 

      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 

       try { 
        File file = null; 

        // judge "imgs/.nomedia"'s existance to judge whether path available 
        if(LightCache.testFileExist(GlobalConfig.getFirstStoragePath() 
          + "imgs" + File.separator +".nomedia") == true) 
         file = new File(GlobalConfig.getFirstStoragePath() 
           + "imgs" + File.separator + fileName); 

        else file = new File(GlobalConfig.getSecondStoragePath() 
          + "imgs" + File.separator + fileName); 

        file.createNewFile(); 
        FileOutputStream ostream = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream); 
        ostream.close(); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onBitmapFailed(Drawable arg0) { 
       return; 
      } 
     }; 

     Picasso.with(GlobalConfig.getContext()) 
       .load(Wenku8API.getCoverURL(mDataset.get(i).getAid())) 
       .into(target); 
+6

Giải pháp này mã hóa luồng byte thành bitmap, sau đó giải mã sẽ nén lại thành một tệp. Gây ra các ngoại lệ bộ nhớ và mất chất lượng hình ảnh. –

+0

LightCache và GlobalConfig không tìm thấy. –

+0

@Programmingvirus Xin chào, các mã chỉ là một mẫu. Tuy nhiên, các lớp bị thiếu đó tồn tại, ** LightCache **: https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/ mewx/wenku8/util/LightCache.java; và ** GlobalConfig **: https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/global/GlobalConfig .java Hy vọng sự giúp đỡ này! – MewX

2

Tuỳ chỉnh mục tiêu để lưu trữ hình ảnh trong bộ sưu tập điện thoại.

public class TargetPhoneGallery implements Target 
{ 
    private final WeakReference<ContentResolver> resolver; 
    private final String name; 
    private final String desc; 

    public TargetPhoneGallery(ContentResolver r, String name, String desc) 
    { 
     this.resolver = new WeakReference<ContentResolver>(r); 
     this.name = name; 
     this.desc = desc; 
    } 

    @Override 
    public void onPrepareLoad (Drawable arg0) 
    { 
    } 

    @Override 
    public void onBitmapLoaded (Bitmap bitmap, LoadedFrom arg1) 
    { 
     ContentResolver r = resolver.get(); 
     if (r != null) 
     { 
      MediaStore.Images.Media.insertImage(r, bitmap, name, desc); 
     } 
    } 

    @Override 
    public void onBitmapFailed (Drawable arg0) 
    { 
    } 
} 

Picasso.with(context).load(image[position]).into(new TargetPhoneGallery(view.getContentResolver(), "image name", "image desc")); 
1

mặc dù bài đăng này cũ, có vẻ như câu hỏi chưa được trả lời. Đọc mã của bạn, có vẻ như cuộc gọi bạn thực hiện với Picasso có thể không đồng bộ. Bạn chắc chắn nên kiểm tra xem, như thể đang xảy ra, bạn đang bắt đầu image.length tác vụ, thay đổi tên tệp ở mỗi tác vụ mới, dẫn tất cả các tác vụ để hoàn thành và lưu vào tên tệp cuối cùng đã được đặt. Để giải quyết vấn đề này, bạn nên ghi đè lên hàm tạo Mục tiêu và thêm thông số tên tệp để sẵn sàng khi tác vụ kết thúc, trong trình nghe của bạn onBitmapLoaded.

Các vấn đề liên quan