在 Gingerbread 2.3.4 中,有时SDCard 的卸载失败。当我检查日志时,mediaserver仍在访问sdcard中的一些文件,甚至vold throw SIGKILL at mediaserver,mediaserver将变成僵尸进程,卸载操作仍然会失败。
我认为失败的原因是MediaScanner仍然持有对对象的引用,这些对象持有对 sdcard 中文件的引用。MediaScanner在MediaProvider中用于从媒体文件中提取专辑封面。但是,即使提取专辑封面操作已经完成,MediaScanner 仍然没有被 Garbage Collector 释放。而当在这种状态下进行卸载操作时,卸载操作肯定会失败。在卸载 SDCard 之前释放 MediaScanner 不会失败。
我所做的是我在MediaScanner类中添加了一个release()函数,一旦完成提取专辑封面,它将由MediaProvider调用。在 release() 函数内部,它将调用native_finalize()。更改后,我能够成功卸载 SDCard。
在MediaScanner的原始源代码中,MediaScanner引用的对象在finalize()函数内部释放。
你们中有人遇到过和我一样的问题吗?除了我上面提到的还有其他解决方法吗?
任何反馈将不胜感激。
问候,
艺术