onSaveInstanceState不保存旋转时的图像

时间:2016-09-26 09:56:54

标签: android screen-rotation savestate

我想保存两张图片,以便在屏幕旋转后它们仍然显示在图像视图中。不知怎的,它不起作用,我不知道为什么。 onRestoreInstanceState也不起作用。有人能帮助我吗?

这是我的代码:

private byte[] mapImage;
private byte[] photo;
private Bitmap imageBitmap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_entry);
    if(savedInstanceState !=null) {
        photo = savedInstanceState.getByteArray(STATE_PHOTO);
        viewPhoto.setImageBitmap(DbBitmapUtility.getImage(photo));

        mapImage = savedInstanceState.getByteArray(STATE_MAP);
        viewGPS.setImageBitmap(DbBitmapUtility.getImage(mapImage));

    }

@Override
protected void onSaveInstanceState(Bundle outState) {
    if(imageBitmap!=null) {
        photo = DbBitmapUtility.getBytes(imageBitmap);
        outState.putByteArray(STATE_PHOTO, photo);
    }
    if(mapImage !=null) {
        outState.putByteArray(STATE_MAP, mapImage);
    }
    super.onSaveInstanceState(outState);
}

private void showMapView() {
    Bundle getImageOfMap = getIntent().getExtras();

    if (getImageOfMap != null) {
        mapImage = (byte[]) getImageOfMap.get("map_image");
        Bitmap showMapImage = DbBitmapUtility.getImage(mapImage);
        viewGPS.setVisibility(View.VISIBLE);
        viewGPS.setImageBitmap(showMapImage);
    }
}

编辑: 我把super.onSaveInstanceState(outState);在onSaveInstanceState(Bundle outState)方法的基础上,现在mapImage在旋转后显示,但imageBitmap仍未显示。我发现imageBitmap已保存,但在onCreate中它是null。 有人知道解决方案吗?

  1. 编辑:mapImage现在以某种方式保存而没有savedInstanceState,因为当我删除mapImage部分时,它仍然在旋转后存在。当我首先发布这个问题时,它并没有像这样。我放弃... 我想我只是在清单中使用不那么漂亮的configChanges解决方案。感谢所有试图提供帮助的人!
  2. 谢谢!

3 个答案:

答案 0 :(得分:0)

你有一个错字。我认为您应该检查imageBitmap != null而不是photo != null

protected void onSaveInstanceState(Bundle outState) {
    if(imageBitmap!=null) {
        photo = DbBitmapUtility.getBytes(imageBitmap);
        outState.putByteArray(STATE_PHOTO, photo);
    }
    if(mapImage !=null) {
        outState.putByteArray(STATE_MAP, mapImage);
    }
    super.onSaveInstanceState(outState);
}

编辑:

另外,请确保onCreate(),初始化viewPhoto(以及其他变量)

viewPhoto = (ImageView) findViewById(R.id.viewPhoto);

if块内访问之前。

答案 1 :(得分:0)

IMO这是一个威胁问题。也许你的图像尺寸更大。尝试将bytearray保存在其他一些线程中。最好使用AsyncTask来保存byre数组。

答案 2 :(得分:0)

除非您的应用在Android的API21 +版本上运行,否则

public void onSaveInstanceState(Bundle outState,PersistableBundle outPersistentState);

不会被调用,因为它在早期版本的平台上根本不存在。为了支持API21之前的设备,您必须覆盖以下方法,而不是上述方法:

public void onSaveInstanceState(Bundle outState);

这也适用于API21 +,因此您不需要覆盖这两种方法(除非您知道需要处理新提供的PersistableBundle)。

你能否确认一下onSaveInstanceState调用意味着它是否被调用?