Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android LoaderCallbacks作为静态内部类(用于处理返回不同数据类型的多个Loader)_Android - Fatal编程技术网

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
参数的有用性吗?