Android LoaderCallbacks作为静态内部类(用于处理返回不同数据类型的多个Loader)
我有一个使用两个装载机的活动。它们各自返回不同类型的数据。要从单个加载程序获取数据,只需将Android LoaderCallbacks作为静态内部类(用于处理返回不同数据类型的多个Loader),android,Android,我有一个使用两个装载机的活动。它们各自返回不同类型的数据。要从单个加载程序获取数据,只需将LoaderCallbacks实现到活动中。我想我可以实现LoaderCallbacks并检查对象的类型,然后确定它是两个LoaderCallbacks中的哪一个,但对我来说这似乎是一个黑客攻击(主要是因为这里缺乏类型安全性) 因此,我考虑将LoaderCallbacks对象设置为静态内部类,如下所示: private static class geocoderLoaderCallbacks impleme
LoaderCallbacks
实现到活动中。我想我可以实现LoaderCallbacks
并检查对象的类型,然后确定它是两个LoaderCallbacks中的哪一个,但对我来说这似乎是一个黑客攻击(主要是因为这里缺乏类型安全性)
因此,我考虑将LoaderCallbacks对象设置为静态内部类,如下所示:
private static class geocoderLoaderCallbacks implements LoaderCallbacks<List<Address>>{
@Override
public Loader<List<Address>> onCreateLoader(int arg0, Bundle arg1) {
GeocoderTask loader = new GeocoderTask(context, "");
return loader;
}
@Override
public void onLoadFinished(Loader<List<Address>> loader, List<Address> data) {
// TODO Auto-generated method stub
}
@Override
public void onLoaderReset(Loader<List<Address>> loader) {
// TODO Auto-generated method stub
}
}
私有静态类geocoderLoaderCallbacks实现LoaderCallbacks将代码从一个潜在的巨大类中移开总是可以的,而且使用不同的类比使用一个可以处理所有事情的类要干净得多。如果您觉得您的活动中有太多的代码,您甚至可能希望使它们成为真正的外部类而不是内部类LoaderCallbacks
是一个接口,因此您可以并且应该在它自己的类中实现它
在构造函数中传递上下文
,只要不保留对它的静态或缓存引用即可。我不确定是否“保留对它的静态或缓存引用”。因为AsyncTaskLoader需要上下文,所以需要上下文。所以我必须把它交给geocoderLoaderCallbacks。但是我应该在我的活动中实例化它并传递对这个特定活动的引用吗?它不会泄露活动吗?在所有示例实现中(其中活动实现LoaderCallbacks),它们使用lm.initLoader(0,null,this)
(此
)将引用传递给活动。然后由AsyncTaskLoader自动处理。但是它对静态内部类的工作方式相同吗?在不同的类中这样做并传递上下文
对于泄漏是安全的,因为加载程序回调类的生命周期与活动本身的生命周期有关。一旦活动被垃圾收集,从那里传出的所有引用也将被垃圾收集。您唯一不能做的事情就是使用对您的活动具有某种引用的静态
变量。如果您按照预期使用提供的类,通常不会出现泄漏问题。太好了,谢谢!和+1,用于提及不要在活动中使用静态变量伟大的问题/答案。但我很好奇,如果你要创建多个实现LoaderCallbacks
的类,这难道不会降低id
参数的有用性吗?