我正在尝试创建一个包含远程服务中的Content Observers的应用程序,但一直出现错误:
“无法在尚未调用Looper prepare的线程内创建处理程序”
我在Android Developers网站上做了很多阅读,以及许多Google搜索,但我仍然没有完全理解这个问题.到目前为止,我从中获得的是内容观察者需要一个线程来运行(对于Handler).添加后:
Looper.myLooper().prepare(); mObserver =新的Observer(新的Handler());
在创建新的Content Observer之前立即进行Looper调用可使应用程序正常工作.但是,我想更好地理解这是为什么-到目前为止,我在网上找不到的任何信息都可以帮助我理解为什么.另外,添加Looper代码行是正确有效的做法吗?我是否需要对此进行任何清理,以防止以后出现内存泄漏?
解释越简单越好.仍在我进行Android开发的第一个月,并取得了良好的进展-*带来了巨大的帮助!谢谢.
更新
经过反复研究和阅读后,我认为对如何进行这项工作以及如何进行清理有更好的了解,但仍然缺少一小部分.
从我收集到的信息中,我可以将Looper.prepare()称为静态方法.然后,我可以使用新的Handler()创建我的Content Observer.当我想停止此Content Observer时,可以使用mLooper = Looper.myLooper.getThread()获取对象的线程,然后运行mLooper.quit().但是,我必须以及何时以及为什么要调用mLooper.loop()?
更新2
好的,这是我要解决的问题.该应用程序在公司内部,解释起来有点复杂,但这是我的最佳选择:
我们正在运行一个接收和发送网络数据的远程服务.我们的消息类型在数据中定义,因此我们可以将它们定向到手机上的正确数据库.有一个Jar界面文件供其他APK导入以连接到正在运行的服务.这些APK可以注册,以便在收到他们感兴趣的新消息时接收广播.为此,将内容查看器注册到APK使用的内容uri,因此当新数据添加到数据库时,内容查看器将发出广播以警告正确的APK.然后,APK可以根据需要进行处理.
因此,可以使用null作为新的Content Observer的参数,还是最好使用new Handler()为此观察者创建线程.
我尝试创建一个线程,但到目前为止它不起作用,我认为这是因为我尚未启动Looper.loop(这冻结了我的服务).任何建议将不胜感激!提前致谢.
解决方法:
在线程中启动Looper时,其他线程将具有向其发送消息的能力,它将接收并处理它们.此方案已在Android中广泛使用:循环程序在UI线程上初始化,其他线程则被分配执行一些冗长的操作.这些“工作者”线程可以通过将消息发布到Handler来将辛苦的结果发送到UI线程.
而且,是的,您需要调用Looper.loop()才能使事情运行.否则,您的处理程序将永远不会收到任何事件.似乎您必须调用Looper.quit()才能停止它并避免资源泄漏.
这是有趣的部分.从ContentObserver’s source code来看,它并不完全需要Handler.如果传递null,它将仅在其运行的同一线程上执行onChange().
附言我的开发机器故障了,所以我无法验证我的陈述.当前版本的ContentObserver可能确实需要Handler才能工作.实验将显示.