【问题标题】:Android - Why is using onSaveInsanceState() to save a bitmap object not being called?Android - 为什么使用 onSaveInstanceState() 来保存未调用的位图对象?
【发布时间】:2012-07-05 14:20:38
【问题描述】:

我正在制作一个简单的绘图应用程序。

我希望能够在设备方向改变时将用户的绘图保存在屏幕上。这只发生在主要活动中。

我读到如果方向发生变化,则活动将被销毁并再次重新创建(onCreate(Bundle created) 被调用)。 我不确定这是否意味着它也应该调用onSavedInstanceState(Bundle bundle),因为在我的应用程序中,只有在另一个活动将焦点放在我的主要活动之上时才会调用它,而不是在旋转到横向/纵向时调用。

我只是在寻找一种方法来保存现有位图并在方向更改时将其传递给主要活动。如果我的onSaveInstanceState 从未被调用,我该怎么办?

另外,由于 Bitmap 实现了parceable,我已经使用它了。

这是主要活动的代码:

 public void onCreate(Bundle savedInstanceState) {      
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
// some more activity code...

        if (savedInstanceState != null) {
        bitmap = savedInstanceState.getParcelable("bitmap");
        Log.d("STATE-RESTORE", "bitmap created");
        paintBoard.setBitmapBackground(bitmap, false);
        Log.d("RESTORING...", "onRestoreInstanceState()");
    } else {
        Log.d("SavedInstanceState", "null");
    }
}


// Never called when I change orientation on my device
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    bitmap = Bitmap.createBitmap(paintBoard.getBitmap());
    outState.putParcelable("bitmap", bitmap);
    Log.d("STATE-SAVE", "onSaveInstanceState()");
}

任何帮助将不胜感激。

编辑:

我从 AndroidManifest.xml 文件中删除了这一行:

android:configChanges="orientation"

现在onSaveInstanceState() 在我改变设备方向时会被调用。

【问题讨论】:

  • 如果你解决了你的问题,那么我认为你应该在这里写下你的解决方案。
  • 好吧,它解决了一半的问题。 onSaveInstanceState() 现在被调用,但无法弄清楚在再次创建 Activity 时如何传递我的 Bitmap 对象。

标签: android bitmap savestate


【解决方案1】:

你应该完整阅读this article

...您可能无法完全恢复您的 系统为您保存的 Bundle 的活动状态 onSaveInstanceState() 回调——它不是为携带大容量而设计的 对象(例如位图)和其中的数据必须被序列化 然后反序列化,这会消耗大量内存并使 配置更改缓慢。在这种情况下,您可以缓解 通过保留有状态的对象来重新初始化您的活动的负担 当您的活动因配置更改而重新启动时。

在运行时配置更改期间保留对象:

  1. 重写onRetainNonConfigurationInstance() 方法以返回 您想保留的对象。
  2. 再次创建活动时, 致电getLastNonConfigurationInstance() 恢复您的对象。

【讨论】:

  • onRetainNonConfigurationInstance 现已弃用。考虑使用 setRetainInstance(boolean retain)
【解决方案2】:

我正在阅读 TheNewBoston https://thenewboston.com/ 的 Android 教程

在第 4 部分中,Travis 向我们介绍了制作一个相机应用程序,该应用程序也可以将图片设置为壁纸。旋转时位图消失的问题并没有解决,他只提供了android:configChanges="orientation"的解决方案,暂时阻止了屏幕旋转。

使用此页面中的信息,我添加了

if (savedInstanceState != null) {
    bmp = savedInstanceState.getParcelable("bitmap");
    iv.setImageBitmap(bmp);
}

在 onCreate 结束时

并添加了这个覆盖

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("bitmap", bmp);
}

在课堂上。

这解决了位图消失的问题。

【讨论】:

  • 这种方法在内存消耗方面好吗?该位图何时会从备忘录中删除?
  • 不要将位图存储在包中。它可以给你TransactionTooLargeException
【解决方案3】:

onConfigurationChanged() 方法可能是解决问题的最简单方法。 它在方向切换之间保存应用程序的当前状态

这个link 有更多关于它的信息。

【讨论】:

    【解决方案4】:

    现在,您可以将数据存储在视图模型中,并在配置更改时保留它们。

    【讨论】:

      【解决方案5】:

      将您的位图保存在onPause()onDestroy(),因为我认为onSavedInstanceState() 在切换方向时不会被android 系统调用。

      【讨论】:

      • 我发现了问题。从未调用过 onSaveInstanceState() 的原因是因为我在 AndroidManifest.xml 文件中添加了这一行:android:configChanges="orientation",据我所知,它旨在处理事件行方向更改和手动滑动硬件键盘以获得更好的性能.删除此行解决了问题。
      • 我发现 onSavedInstanceState() 绝对是在设备旋转时调用的。
      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多