我关注了如何在Android中反转地理编码this tutorial,但我无法理解这个IntentService
如何很好地处理Activity
生命周期。我正在关注this code sample。
据我了解,Activity
将包含AddressResultReceiver
的实例,名为mResultReceiver
。当IntentService
返回反向地理编码的地址时,它会从mReceiver.send(resultCode, bundle)
实例调用mResultReceiver
,然后Activity
内的用户更新用户界面Activity
我的问题是这将如何与Activity
生命周期一起发挥作用。让我们假设IntentService
启动IntentService
,然后由于某种原因,它被销毁(就像用户旋转屏幕一样)。之后,当mResultReceiver
从Google地图收回地址时,它会调用从原始Activity
收到的mResultReceiver
,现在已被销毁(或者可能已经再次创建)但是,无论如何,它仍将是一个新的实例。)
由于Activity
是在创建Bundle
时创建的,并且它未被保存在任何IntentService
上以供日后检索,因此当mResultReceiver
完成时调用原始mResultReceiver
,会发生什么?
Activity
调用是否会自动转发到mResultReceiver
的新实例,就像什么都没发生一样,所有工作都按预期工作?
将Activity
作为垃圾与被破坏的IntentService
一起收集,而mResultReceiver
在尝试使用被销毁的类时会抛出异常吗?
Activity
会阻止原始IntentService
被垃圾回收,特别是因为mResultReceiver
仍然保留对IntentService
对象的引用。当mReceiver.send(resultCode, bundle)
调用Activity
时,它会对屏幕上的实际$("#autocomplete").autocomplete({
source: function (request, response){
$.ajax({
url: 'autocomplete.txt',
dataType: "json",
data:
{
term: request.term,
},
success: function (data)
{
response(data);
}
});
},
minLength: 2,
select: function (event, ui)
{
var test = ui.item ? ui.item.id : 0;
if (test > 0)
{
alert(test);
}
}
});
产生影响,或者尝试更新已销毁的UI小部件时抛出异常?
这个google示例有缺陷吗?那么正确的做法是什么?
答案 0 :(得分:1)
我相信谷歌的例子是有缺陷的。如果活动被破坏,样本将导致内存泄漏。更好的方法是使用本地广播接收器或事件总线或RxJava / RxAndroid
Issue is already reported here