2

我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 是下载图像的错误选择?我应该使用其他东西吗?服务?

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

4

2 回答 2

1

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

于 2012-07-09T21:34:18.833 回答
0

I've already answered somewhere. I found a very nice example: read this. This example for old APIs.

For new you can use setRetainInstance method of a fragment (if you use fragments).

于 2012-07-09T21:17:25.277 回答