我有一个使用两个加载程序的 Activity 。它们每个都返回不同类型的数据。要从单个Loader获取数据,只需将LoaderCallbacks<D>实现到Activity中。我想我可以只实现LoaderCallbacks<Object>并检查对象的类型,然后确定它是两个LoaderCallbacks中的哪一个,但是对我来说似乎很hack(主要是因为此处缺乏类型安全性)。

因此,我考虑将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

    }


}

然后使用lm.initLoader(0, null, geocoderLoaderCallbacks)

出现两个问题:可以这样做,还是应该坚持在Activity中实现LoaderCallbacks?以及如何安全地将上下文传递给onCreateLoader?我应该只在geocoderLoaderCallbacks中构造一个构造函数,然后像lm.initLoader(0, null, geocoderLoaderCallbacks(this))那样传递上下文吗?

LoaderManager with multiple loaders: how to get the right cursorloader这里有一个类似的问题,但是没有解释如何管理具有不同数据类型的两个加载器。

最佳答案

将代码从潜在的巨型类中移开总是可以的,与其他类一起处理可以处理所有事情的代码要干净得多。如果您觉得自己的Activity内部包含太多代码,则甚至可能希望使它们成为真正的外部类,而不是内部类。 LoaderCallbacks是一个接口(interface),因此您可以并且应该在自己的类中实现它。

只要您不保持静态或缓存对其的引用,就可以在构造函数中传递Context很好。

10-08 20:01