Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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 具有多个加载器的LoaderManager:如何获得正确的游标加载器_Android_Android Loadermanager_Android Loader - Fatal编程技术网

Android 具有多个加载器的LoaderManager:如何获得正确的游标加载器

Android 具有多个加载器的LoaderManager:如何获得正确的游标加载器,android,android-loadermanager,android-loader,Android,Android Loadermanager,Android Loader,对我来说,如果你有多个加载器,如何获得正确的光标还不清楚。假设您定义了两个不同的加载程序: getLoaderManager().initLoader(0,null,this); getLoaderManager().initLoader(1,null,this); 然后在onCreateLoader()中,根据id执行不同的操作: @Override public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

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

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;
} 
@覆盖
公共加载器onCreateLoader(int-id,Bundle arg1){
如果(id==0){
游标装入器装入器=新游标装入器(getActivity(),
MaterialContentProvider.CONTENT(URI,null,null,null,null);
}否则{
游标装入器装入器=新游标装入器(getActivity(),
CustomerContentProvider.CONTENT\u URI,null,null,null);
};
返回装载机;
} 
到目前为止还不错。但是如何在onLoadFinished()中获取正确的光标,因为您没有为正确的光标适配器标识正确的光标的id

@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
@覆盖
public void onLoadFinished(加载器arg0,光标){
mycursoradapter1.swapCursor(游标);
如果(isResumed()){
SetListShowed(真);
}否则{
SetListShownAnimation(真);
}
}
//在哪里可以找到mycursoradapter2的光标

或者我错了,这是在一个片段中获取两个不同游标适配器结果的错误方法。

加载程序类有一个名为的方法。我希望这会返回与加载程序关联的id。

使用加载程序的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;
    }
}    
@覆盖
public void onLoadFinished(加载器,光标){
开关(loader.getId()){
案例0:
//在这里做些事情
打破
案例1:
//在这里做些别的事情
打破
案例2:
//在这里多做些事情
打破
违约:
打破
}
}    

如果您的加载程序除了结果的类类型(此处:
Cursor
)之外没有任何共同点,那么最好创建两个独立的
加载回调
实例(简单地说,作为活动/片段中的两个内部类),每个实例都专用于一个加载程序处理,而不是尝试将苹果和橙子混合在一起


在您的案例中,数据源和结果处理似乎都不同,这要求您编写额外的样板代码来识别当前场景,并将其分配到适当的代码块。

这是一个非常好的问题!这个问题问得很好,涉及到一个相当微妙的主题。非常具体。应该提到的是,当加载程序返回类型在所有加载程序中不相同时,您必须使用单独的处理程序类,因为由于泛型类型擦除,Java不允许您使用多个类型实现接口(
LoaderCallbacks
)。它只适用于您的情况,因为这两次,结果都是一个
光标
@Matthias Great,您已经提到过了!我只是在考虑如何有两个不同返回类型的装载机。那么,如果两个装载机具有两种不同的返回类型,该怎么办?使用1个加载程序执行一个任务,使用线程执行另一个任务?@Robert无需使用线程。您可以使用两个
Loader
s。请看一下谢谢,库蒂斯!酷!我会试试看,但我希望它能奏效。我也有同样的想法,但没有看装载器对象。我们看了一下游标对象……它与Loader.getID()一起工作!我现在已经仔细检查过了。伟大的我想通过使用内部/匿名类来实现这一点,这样每个加载程序都有自己的对象来获取回调。@KurtisNusbaum,为什么这不正确?内部类将与外部活动一起被销毁,因此这不会导致内存泄漏或其他任何情况。对活动具有强引用的静态类在语义上等同于内部类(内部类保留对外部类的隐式强引用)。@Jords这在技术上是正确的。我不是在争论这个问题。但是当你可以直接调用
getId()
时,为什么还要这么繁琐呢?我有一个问题。
Activity
实现
LoaderCallbacks
并将
传递给
getLoaderManager().initLoader()
的目的是确保
LoaderManager
充当
Activity
Loader
之间通过
LoaderCallbacks
的通信通道。作为
活动
在这里创建的通信通道如何不是实现
加载回调
,而是创建匿名内部类?通信通道是
加载回调
。无需将
活动
本身用作
装载机回调
。在需要时创建多个通信通道更简单。