Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 存储多个位图时的性能问题_Android_Performance_Bitmap_Android View - Fatal编程技术网

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>

问题

  • 我是否应该始终在内存中保留这5个单独的视图实例(位图大小为1024x600)
  • 我是否应该合并功能,以便只需将一个视图添加到布局XML中,然后在每次需要更新视图时重新生成位图
  • 请记住,由于位图的复杂性,重新绘制位图可能需要一些时间,哪个选项对性能更有利
  • 文档


    我已经阅读了上的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正是我所担心的。那么,如何在保持性能平稳的同时避免这种情况呢?