CursorLoaders和AsyncTaskLoaders使用相同的LoaderManager

时间:2012-06-03 18:49:53

标签: android android-cursorloader asynctaskloader

我有一个使用多个CursorLoaders的片段。一切正常。现在我需要将AsyncTaskLoader添加到同一个片段中。

问题是,我如何使用相同的LoaderManager.LoaderCallbacks接口来管理我的CursorLoader和AsyncTaskLoader?

我的想法是,由于CursorLoader是一个AsyncTaskLoader,那么我应该能够将LoaderCallBacks调整为两者,但我可能会错过这条船......

2 个答案:

答案 0 :(得分:2)

这仅在所有加载器返回相同类型时才有效。如果这是真的,那么您只需为您启动的每个加载器指定唯一ID。将相同的ID传递给onCreateLoader()调用,这样您只需检查该ID即可确定要创建的加载程序。

答案 1 :(得分:0)

我觉得这个问题太迟了,希望能帮助一些人。

我刚刚在同一个Activity中完成了一个带有多个加载器的项目,一个用于数据库的CursorLoader,另一个用于网络作业的AsynctaskLoader。

    class YourActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks {
    // you still implements LoaderManager.LoaderCallbacks but without add <returnType> 
    //and you have to cast the data into your needed data type in onLoadFinished()

        Private int loader1 = 1;   // eg. CursorLoaderId
        private int loader2 =2;    //eg. AsynctaskLoaderId

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

// init loader with different Id
        getSupportLoaderManager().initLoader(yourLoaderId, null, this);
    }
        @Override
        public Loader onCreateLoader(int id, Bundle args) {
            if (id == loader1 ) {

                //YourLoaderClass1 is you loaderClass where you implement onStartLoading and loadingInBackground() 
                return new YourLoaderClass1();  
            } else if (id == loader2 ) {

                return new YourLoaderClass2();
            }
            return null;
        }

        @Override
        public void onLoadFinished(Loader loader, Object data) {
            int id = loader.getId();// find which loader you called
            if (id == loader1 ) {

                yourMethod1((List< >) data); // eg. cast data to List<String>
            } else if (id == loader2 ) {
                yourMethod1((String) data); // eg. cast data to String
            }
        }

        @Override
        public void onLoaderReset(Loader loader) {
            int id = loader.getId();
            if (id == loader1 ) {

            } else if (id == loader2 ) {

            }
        }
    }

这是我的answer下的其他问题以及我的项目link