0

Я работаю с приложением и имею около 10 видов просмотра, когда я перемещаюсь между фрагментами, сбой приложения с нехваткой памяти.
Я использую много изображений в этом приложении
Я хочу знать, как применить растровую рециркуляцию, как это основная причина, за исключениемКак применить растровое преобразование в recycleView из-за исключения из памяти

Мой рецикл адаптер:

public void onBindViewHolder(MboViewHolder holder, int position) { 
    GameEvent gameEvent = ev.get(position); 
    holder.bindPhoto(holder,cnt,gameEvent.getEventImage());} 

BindPhoto mwthod является:

public void bindPhoto(MboViewHolder mbo,Context cnt, String photoUrl) { 
     mbo.img.setTag(photoUrl); 
     Bitmap imgz = Tools.getPhoto(photoUrl, 0); 

    if (imgz != null) { 
     mbo.img.setImageBitmap(imgz); 
     Log.e("NoDwnLd","No"); 
    } else { 
     Bitmap largeIcon = BitmapFactory.decodeResource(cnt.getResources(), R.drawable.ic_default); 
     mbo.img.setImageBitmap(largeIcon); 
     new DownloadBitmap(cnt,mbo.img,"2").execute(photoUrl); 
    } 

МоиDownloadBitmapAsyncTask является:

public class DownloadBitmap extends AsyncTask<String, Void, Bitmap> { 

private int flag=0; 
private ImageView img; 
private String type; 
private HashMap<String, Bitmap> map= new HashMap<>(); 
private Context cnt; 
private String url; 

public DownloadBitmap(Context cnt, ImageView img, String type) { 
    this.cnt = cnt; 
    this.img=img; 
    this.type=type; 
} 

public DownloadBitmap(Context cnt, ImageView img, String type, HashMap<String, Bitmap> map) { 
    this.cnt = cnt; 
    this.img=img; 
    this.type=type; 
    this.map=map; 
} 


public DownloadBitmap(Context context) { 
    this.cnt=context; 
    this.flag=2; 
} 


@Override 
protected Bitmap doInBackground(String... params) { 
    Bitmap bitmap=null; 
    if (cnt!=null){ 
    boolean check = new CheckInternetConnection(cnt).haveNetworkConnection(); 
    if (check) { 
     try { 
      url=params[0]; 
      if (url==null || url.equals("")) return null; 
     InputStream in = new java.net.URL(url).openStream(); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = Globals.inSampleSize; 
      bitmap = BitmapFactory.decodeStream(in,null,options); 
      return bitmap; 
    } catch (Exception e) { 
     Log.e("ImageDownload", "Download failed: " + e.getMessage()); 
    } 
    } 

    } 
    return bitmap; 
} 

@Override 
protected void onPostExecute(Bitmap bitmap) { 
    if(bitmap != null){ 
     bitmap=Tools.resizeImage(bitmap,500,500); 
    //view.setImageViewBitmap(R.id.nt_img, bitmap); 
     if(type == "1") Tools.sendNotification(cnt, bitmap); 
     if(type == "2") { 
      if(img.getTag()!= null && img.getTag() == url){ 
       // keep all images stored on memory for fast retrieval 
      // map.put(url, bitmap); 
      // Log.e("url", url); 
       // save the image inside the image holder 
       //img.setImageBitmap(map.get(url)); 
       Log.e("DwnLD",img.getTag()+""); 
       img.setImageBitmap(bitmap); 
       Tools.storePhoto(img.getTag().toString(), bitmap); 
      } 
    // Log.e("ImageDownload", "bitmap in imageview"); 
     } 
     if (type == null){ 
     // map.put(url, bitmap); 
      // if (img!=null && map.get(url)!=null)img.setImageBitmap(map.get(url)); 
      if (img!=null)img.setImageBitmap(bitmap); 
     } 

    if (cnt != null && flag ==2){ 
     Tools.storePhoto(CreateEvent1Fragment.searchResult.get(0).getEventImage(),bitmap); 
    // Log.e("ImageDownload", "bitmap in imageview"); 
    } 
    } 
} 

МоиTools.resizeImageявляется:

public static Bitmap resizeImage(Bitmap bitmap,int newWidth,int newHeight){ 
    Bitmap resized = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 
    return resized; 
} 

МоиTools.storePhotoявляется:

public static void storePhoto(String url,Bitmap image){ 
File img = null; 
File env = new File(Environment.getExternalStorageDirectory() + Globals.DIR); 
if(!env.exists()) env.mkdir(); 
String filename = extractUrl(url); 
    img=new File(Environment.getExternalStorageDirectory()+Globals.DIR+filename); 
if (!img.exists()) { 
    // Log.e("PHOTOS",img.getAbsolutePath()); 
    try { 
     FileOutputStream fos = new FileOutputStream(img); 
     image.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

МоиTools.getPhotoявляется:

public static Bitmap getPhoto(String url,int type){ 
    Bitmap bmp=null; 
    String filename = extractUrl(url); 
    File ff = new File(Environment.getExternalStorageDirectory()+Globals.DIR+filename); 
    if(!ff.exists()){ 
     return bmp; 
    }else { 
     if (type != 1){ 
      bmp = Tools.decodeFile(ff); 
      return bmp; 
     }else { 
      bmp = BitmapFactory.decodeFile(ff.getAbsolutePath()); 
      return bmp; 
     } 
     } 
} 

МоиTools.decodeFileявляется:

 public static Bitmap decodeFile(File f) { 
    try { 
     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     // The new size we want to scale to 
     final int REQUIRED_SIZE=70; 

     // Find the correct scale value. It should be the power of 2. 
     int scale = 1; 
     while(o.outWidth/scale/2 >= REQUIRED_SIZE && 
       o.outHeight/scale/2 >= REQUIRED_SIZE) { 
      scale *= 2; 
     } 

     o.inSampleSize = scale; 
     o.inJustDecodeBounds = false; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o); 
    } catch (FileNotFoundException e) {} 
    return null; 
} 

Я хочу, чтобы применить растровую рециркуляцию ... Как я могу это сделать?

+0

пытаются использовать свои методы на этот ответ, вместо того, чтобы ваш метод изменения размера HTTP: // StackOverflow .com/вопросы/41236948/android-splash-screen-does-not-display/41237293 # 41237293 – Noorul

+0

В вашем файле манифеста добавьте этот андроид: largeHeap = "true" для лучшего понимания, см. Это http://stackoverflow.com/questions/27396892/what-are-advantages-of-setting-largeheap-to-true –

+0

Мне нужно решение для большой памяти не решение для аварии спасибо @E –

ответ

0

попробовать с помощью Libs Glide

https://github.com/bumptech/glide

изменение

if (imgz != null) { 
    mbo.img.setImageBitmap(imgz); 
    Log.e("NoDwnLd","No"); 
} else { 
    Bitmap largeIcon = BitmapFactory.decodeResource(cnt.getResources(), R.drawable.ic_default); 
    mbo.img.setImageBitmap(largeIcon); 
    new DownloadBitmap(cnt,mbo.img,"2").execute(photoUrl); 
} 

в

if(!photoUrl.isEmpty()) { 
     Glide.with(this).load(photoUrl).error(R.drawable.ic_default).into(mbo.img); 
    Log.e("NoDwnLd","No"); 
} else { 
    Glide.with(this).load(R.drawable.ic_default).error(R.drawable.ic_default).into(mbo.img); 
    new DownloadBitmap(cnt,mbo.img,"2").execute(photoUrl); 
} 
+0

если есть какое-либо решение без использования библиотеки? –

+1

Вы можете использовать LruCache и DiskLruCache для создания собственного механизма повторного использования битмапа. https://developer.android.com/reference/android/util/LruCache.html – Rasmusob

 Смежные вопросы

  • Нет связанных вопросов^_^