Android 在屏幕旋转期间保存 Activity 数据

标签 android screen-rotation

我谷歌了很多,但现在我决定问..

我的 Activity 只做一件简单的事情 - 它使用 AsyncTask 从 Internet 下载图片。

但是有很多问题,我不确定,如何解决..

1.] 用户在 AsyncTask 下载图片后 旋转屏幕。我应该如何处理这个屏幕旋转?在哪里临时保存图片以便在 Activity 重新创建后可用?

不想锁定屏幕方向(android:screenOrientation="landscape")或自己处理它(android:configChanges="orientation")..

我只是想把图片保存在某个地方..

我知道这可以通过使用 onRetainNonConfigurationInstance()getLastNonConfigurationInstance() 来完成,但两者现在都已弃用。 Bundle 不适用于图像,因为它是为字符串(可序列化)数据制作的。我可以将图片保存到数据库或某个地方的文件,但这是不必要的。我在某处读到,它可以通过 Loader 完成,但我不知道怎么做?可能吗?

2.] AsyncTask 下载图片期间 用户旋转屏幕。

我希望 AsyncTask 继续下载。下载完成后,AsyncTask 应在 onPostExecute 方法中将图像保存到新的(重新创建的) Activity 。

我认为如果 AsyncTask 是 Activity 的内部类,它会起作用..?但是如果我不希望它成为内部类,我必须保存对 Activity 的引用,例如在变量中。但是如果我发送对 Activity 的引用作为 AsyncTask 的构造函数的参数,并且在屏幕旋转后重新创建 Activity,AsyncTask 中的变量确实引用原始 Activity ,因此新的不知道下载的图片,它必须重新开始下载..

或者 AsyncTask 是下载图像的错误选择?我应该用别的东西吗?服务?

So.. 如何解决这些问题?我相信很多应用程序开发人员也必须解决这个问题。但这对我来说都是希腊语:(

最佳答案

当您的 AsyncTask 完成图像下载后,将其保存到应用程序的缓存目录中。将保存图像的路径保存在 Activity 类的属性中。然后,您可以覆盖 Activity 的 onSaveInstanceState 方法,以便在方向更改期间将缓存的图像路径传递给自身。在您的 onCreate 方法中,检查 savedInstanceState 包以获取已保存的图像路径。如果该路径存在,请不要尝试重新下载图像。相反,只需从磁盘加载图像。

关于Android 在屏幕旋转期间保存 Activity 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11403237/

相关文章:

android - 谷歌分析阻止安卓应用

java - 滚动后 ListView 项目保持突出显示

android - 如何在 Google Play 上测试应用程序更新?

Android 屏幕旋转,ACCELEROMETER_ROTATION

ios - 启动屏幕旋转不适用于 iPhone 6s 和更小的屏幕

Android 方向变化

android - 将 ImageView 设置为底部

java - 将数据发送回 Intent

android - 多个DatePicker,屏幕旋转时强制关闭

ios - 在旋转期间更新 UIPageViewController 时不调用完成 block