具有多个加载程序的LoaderManager:如何获取正确的cursorloader


116

对我来说,如果有多个加载程序,则不清楚如何获得正确的光标。假设您定义了两个不同的Loader:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

然后在onCreateLoader()中,根据ID做不同的事情:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

到目前为止,一切都很好。但是如何在onLoadFinished()中获得正确的光标,因为您没有任何ID来为正确的Cursoradapter识别正确的Cursor。

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

还是我错了,这是在一个片段中获取两个不同的cursoradapter结果的错误方法。


这是一个非常好的问题!这是很好的要求,并且涉及一个相当细微的主题。非常具体。
Kurtis Nusbaum

7
应当指出的,只要所有加载器的加载器返回类型都不相同,必须使用单独的处理程序类,因为由于通用类型擦除,Java不允许您实现一个以上的接口(LoaderCallbacks在这种情况下)类型。由于这两种情况都只能在您的情况下使用,结果是Cursor
马提亚斯(Matthias)2012年

1
@Matthias伟大,您已经提到了!我只是在考虑如何让2个装载机具有不同的返回类型。那么,如果2个装载机具有2种不同的返回类型怎么办?用1个加载程序执行一项任务,而用线程执行另一项任务?
罗伯特

@Robert无需使用线程。您可以使用两个Loaders。请通过以下stackoverflow.com/a/20839825/2818583
AnV 2016年

Answers:


119

Loader类具有一个称为getId()的方法。我希望这会返回您与加载程序关联的ID。


谢谢,库蒂斯!凉!我会尝试的,但是期望它会起作用。我有相同的想法,但没有看加载程序对象。而是看了看光标对象...
凯·格拉登2011年

它与Loader.getID()一起使用!我现在已经仔细检查了这一点。大!
凯·格拉登

2
我正在考虑通过使用内部/匿名类来执行此操作,以便每个加载器都有其自己的对象来获取回调。
乔德斯(Jords)2012年

@KurtisNusbaum,为什么那是不正确的?内部类将与外部Activity一起被销毁,因此这不会导致内存泄漏或其他任何情况。具有较强的参考活性静态类在语义上等同于一个内部类(而保持隐式强引用外部类。)
的Matthias

6
@Jords从技术上来说是正确的。我没有在争论。但是当您可以打电话时,为什么要使用所有rigamarole getId()呢?
Kurtis Nusbaum 2012年

32

使用加载程序的getId()方法:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

如果您的加载程序除了结果的类类型(此处为Cursor)外没有其他共同点,那么最好创建两个单独的LoaderCallbacks实例(在您的Activity / Fragment中是两个内部类),每个实例专门用于一种加载程序处理,而不是而不是尝试将苹果与橙子混合。

在您的情况下,数据源和结果处理似乎都不同,这要求您编写额外的样板代码以标识当前方案并将其分派到适当的代码块。


我有一个问题。的目的Activity实现LoaderCallbacks并传递thisgetLoaderManager().initLoader()是确保LoaderManager充当之间的通信信道ActivityLoader通过LoaderCallbacks。如何在这里创建通讯渠道,而Activity不是在实现LoaderCallbacks,而是创建匿名内部类?
AnV

3
沟通渠道是LoaderCallbacks。不需要将Activity自身用作LoaderCallbacks。在需要时创建多个通信渠道更为简单。
BladeCoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.