AsyncTask Loader问题:LoaderManager.init()参数类型不匹配咨询
解决LoaderManager类型不匹配问题
嘿,这个问题其实是因为你混用了原生Android框架和support库的Loader相关类导致的,下面给你梳理清楚该怎么选:
核心原则:保持组件版本统一
所有Loader相关的组件必须一套到底:要么全用原生框架的,要么全用support.v4库的,绝对不能交叉混用。
情况1:你的Activity继承自AppCompatActivity(或其他support/v7组件)
这种场景下必须用support.v4库的整套Loader组件:
- 导入正确的包:
import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.app.LoaderManager.LoaderCallbacks; - 让你的Activity实现
LoaderCallbacks<D>(D是你的Loader要返回的数据类型,比如String或者自定义实体类):public class YourActivity extends AppCompatActivity implements LoaderCallbacks<YourDataType> { // ... 你的业务代码 } - 调整你的Loader调用代码(注意泛型匹配):
LoaderManager loaderManager = getSupportLoaderManager(); Loader<YourDataType> loader = loaderManager.getLoader(SEARCH_LOADER); if(loader == null) { loaderManager.initLoader(SEARCH_LOADER, bundle, this); }
情况2:你的Activity继承自原生Activity(仅适配API 11及以上版本)
如果你的App只需要支持Android 3.0(API 11)以上的系统,那可以直接用原生框架的Loader组件:
- 导入原生包:
import android.app.LoaderManager; import android.content.Loader; import android.app.LoaderManager.LoaderCallbacks; - Activity实现原生的
LoaderCallbacks<D>:public class YourActivity extends Activity implements LoaderCallbacks<YourDataType> { // ... 你的业务代码 } - 替换成原生的LoaderManager获取方法:
LoaderManager loaderManager = getLoaderManager(); Loader<YourDataType> loader = loaderManager.getLoader(SEARCH_LOADER); if(loader == null) { loaderManager.initLoader(SEARCH_LOADER, bundle, this); }
为什么你之前会报错?
你遇到的Required: android.app.LoaderManager Found: android.support.v4.app.LoaderManager错误,本质是代码里某个地方期望原生的LoaderManager,但你调用getSupportLoaderManager()返回的是support库的实例,类型不匹配。而如果导入v4包却报错,大概率是你Activity实现的是原生的LoaderCallbacks,而非v4库的版本,导致回调接口类型不兼容。
只要保持所有Loader相关类的版本统一,这个问题就能轻松解决啦~
内容的提问来源于stack exchange,提问作者Ragavendra M
相关产品推荐
相关产品推荐

