【问题标题】:Android save Activity data during screen rotationAndroid 在屏幕旋转期间保存 Activity 数据
【发布时间】:2014-05-23 15:19:25
【问题描述】:

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

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

但是有很多问题,我不知道如何解决..

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • "此方法已弃用。请改用新的 Fragment API setRetainInstance(boolean);"也许尝试查看 Frament API? developer.android.com/reference/android/app/Fragment.html
  • @user1454749 旧版本的 Android 怎么样?我们中有 吨 人仍在使用 Android 2.x
  • 是的,我当然注意到了这一点。但最好是通过示例查看解决方案。尤其是如果你是初学者...
  • @Izkata for Android 2.x 有一个兼容性库.. :)

标签: android screen-rotation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我已经在某个地方回答过了。我找到了一个很好的例子:阅读this。此示例适用于旧 API。

    对于新的,您可以使用片段的setRetainInstance 方法(如果您使用片段)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多