Android 存储多个位图时的性能问题
我已经创建了一个自定义的Android 存储多个位图时的性能问题,android,performance,bitmap,android-view,Android,Performance,Bitmap,Android View,我已经创建了一个自定义的视图对象,它覆盖了onDraw方法来绘制一个相当复杂的UI。我将这些自定义视图中的5个添加到LinearLayout上,但在任何时候都只有一个视图可见 根据应用程序中用户的操作,我将切换每个应用程序上的View.Visibility属性,以便只有一个可见 我只是想澄清一下,我使用的方法对我很有效,而且似乎反应相当迅速。我只是有点担心这种方法会如何影响低端或低规格设备。 以下是我当前代码的示例: 自定义视图 public class MyDrawingView extend
视图
对象,它覆盖了onDraw
方法来绘制一个相当复杂的UI。我将这些自定义视图中的5个添加到LinearLayout上,但在任何时候都只有一个视图可见
根据应用程序中用户的操作,我将切换每个应用程序上的View.Visibility
属性,以便只有一个可见
我只是想澄清一下,我使用的方法对我很有效,而且似乎反应相当迅速。我只是有点担心这种方法会如何影响低端或低规格设备。
以下是我当前代码的示例:
自定义视图
public class MyDrawingView extends View {
private Bitmap mViewBitmap;
private int mWidth = 1024; // The width of the device screen
private int mHeight = 600; // Example value, this is dynamic
@Override
protected void onDraw(Canvas canvas) {
// Copy the in-memory bitmap to the canvas.
if(mViewBitmap != null) canvas.drawBitmap(mViewBitmap, 0, 0, mCanvasPaint);
}
private void drawMe() {
if(mViewBitmap == null) mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(mViewBitmap);
c.drawBitmap(...);
c.drawText(...);
// Multiple different methods here drawing onto the canvas
c.save();
}
}
布局XML
<LinearLayout>
<com.company.project.ui.MyDrawingView
android:id="@+id/myCustomView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.company.project.ui.MyDrawingView
android:id="@+id/myCustomView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.company.project.ui.MyDrawingView
android:id="@+id/myCustomView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.company.project.ui.MyDrawingView
android:id="@+id/myCustomView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.company.project.ui.MyDrawingView
android:id="@+id/myCustomView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
问题
我已经阅读了上的Android文档,但是我觉得我已经实现了自定义视图中概述的要点,我认为它并不完全涵盖我的场景。我不确定为什么要在视图中放置一个具有设备大小的
线性布局
,然后相应地隐藏。你最好使用a或者更好的a
最好的是ViewPager,因为在不可见时,您可以从内存中取消分配位图
此外,如果您正在从internet或SD卡加载图像,则可以使用它,从而简化缓存和内存管理。无需重新发明轮子:)好的,所以我听取了星载Geobits对堆大小的评论,并提出了一个解决方案:
位图上
RGB_565
,以使位图稍微小一些在完成上述操作之后,我成功地将整个应用程序所需的RAM减少到25Mb,这让我非常满意。LinearLayout包装器就是一个例子。实际上,布局XML要复杂得多,但我关心的只是视图的这一部分,主要是在内存中存储如此大的位图的影响。如果我不需要任何动画或用户交互,那么
ViewFlipper
或ViewPager
对我当前的方法有什么好处?这些都已经在我的视图中处理好了如果我正确理解了您的问题,ViewPager有设置屏幕外页面限制的好处ViewFlipper
将处理所有可见性内容,使代码更具可读性<前面提到的代码>视图页面将为您提供一种更简单的视图回收方法。但我认为最重要的是UIL,因为它将使加载图像成为一项非常简单和安全的任务,因为它是一个经过良好测试的库。“站在巨人的肩膀上”;)低端设备的最大问题是堆大小。位图本身占用1024*600*4*5=12MB
(ARGB_8888)。在具有16MB堆的设备中,这是相当大的一块。也就是说,假设图像只有1024x600。如果您的值是动态的,那么它们可能根本不适合堆。@Geobits正是我所担心的。那么,如何在保持性能平稳的同时避免这种情况呢?