2014-09-27 66 views
0

我正在捕获屏幕,只要屏幕被触摸,我将位图保存在ArrayList中。避免位图被自动回收 - Android

screen.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      count++; 
      screen.setDrawingCacheEnabled(false); 
      screen.setDrawingCacheEnabled(true); 

      Bitmap b = screen.getDrawingCache(); 
      bitmapList.add(b); 
      Log.e("Captured Image Number: ", ""+count); 
      return false; 
     } 
    }); 

然后,当我尝试访问位图来保存它们时,它们不再存在,回收!
我该怎么办?
如果我在这里保存,需要很长时间。
试图转换为byte[]以避免回收,它也花了很长时间的预期。
我想保持它高达15fps我应该做什么。

+1

有一件事要尝试将每个位图的副本存储到数组中。使用Bitmap.copy(config,true)。 – harism 2014-09-27 11:16:43

+0

@harsim也尝试过......没有运气,回收。 – Salmaan 2014-09-29 03:33:54

回答

0

将位图存储在类级变量中而不是临时变量。如果您的屏幕仍然处于活动状态,并且您的屏幕持有对位图对象的硬引用,则不应该对其进行回收。

0

这可能为时已晚。但是,由于目前还没有适当的答案,所以我想在这个问题上发布我的解决方法。我尝试了哈里斯的回答,它需要像这样使用。

所以,如果你有一个位图的数组列表,首先你需要使用Bitmap.copy(Bitmap.Config config, boolean isMutable)方法保存位图的副本。

然后,当您要使用位图时,请不要直接使用位图,而应使用相同的复制方法获取位图的副本,并且复制的位图应该在您的应用程序中使用。

底线是一次位图被多次使用,它将被回收。因此,我所做的是避免使用原始位图,我采用原始位图的副本并使用它们。