Android 在 3.0 后引入了 Loader 机制,并且 v4 包提供了 support 。所以,看上去实用性还是很强的。
使用其实还是比较简单,有以下几点:
这样,大体上,你的 demo 就能跑了。特别是如果你是照着网上很多例子写的,而那些例子也基本上都是照着 google 的官网写的,他们都用的是 CursorLoader 这个特殊的 Loader 。而我在打算自己写一个 Loader 的时候碰见了一些问题,因为我不能一用 Loader 就只能用 Cursor 吧?
想要用 Loader,就去看看 Loader 怎么用,在文档里看到这么一句话:Most implementions should not derive directly from this class , but instead inherit from SyncTaskLoader . 好吧,去看看 SyncTaskLoader 吧,结果官方给了一个很长很长的 demo,以及很短很短的说明。
于是我抛开文档,自己写试试吧,自定义了一个类,继承于 SyncTaskLoader,提示重写构造方法,提示重写 loadInBackground() 方法。都写好了,在 onCreateLoader() 方法 return 了一个自定义的 Loader 的实例。在 Activity onCreate 的时候调用了 initLoader() 方法,跑一下吧。结果毛都没有。加断点调试的时候,发现 loadInBackground() 方法根本没有调用,WTF。
最后查找了一下,在 stackoverflow 上,有个哥们说,你试试重写 onStartLoading() 方法,然后调用 forceLoad() 方法。试完了果然管用。一个很意外的坑啊。
这里的感受,是对这个 API 设计的一些想法,不知道为啥这样设计。
SyncTaskLoader 其实是封装了一个 SyncTask 在里面的,而 SyncTask 是被很多开发者抛弃的,除了跟这个 Loader 一样难用以外,还包括对线程控制不理想。
- EOF -
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]
本文标题: Android Loader 机制
本文地址: https://binkery.com/archives/512.html