这是我第一次使用加载器。我正在使用加载器来检索手机的联系人列表。
这是我的代码:
@SuppressLint("InlinedApi")
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
String[] projection = { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME_PRIMARY, Contacts.PHOTO_THUMBNAIL_URI };
return new CursorLoader(this, Contacts.CONTENT_URI, projection, null, null, null);
} else {
String[] projection = { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME };
return new CursorLoader(this, Contacts.CONTENT_URI, projection, null, null, null);
}
}
@SuppressLint("InlinedApi")
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor.getCount() > 0) {
//PARSE DATA
}
cursor.close();
}
在我调用的onCreate()
方法
getSupportLoaderManager().initLoader(0, null, this);
我得到了联系人列表,但加载程序在主线程而不是另一个线程中执行查询,从而阻止了 ui。
请帮忙吗?
我会质疑你关于查询在 UI 线程中运行的断言。查询在后台线程 (onCreateLoader) 中运行,结果的游标在 UI 线程 (onLoadFinish) 上返回给您,目的是您可以使用结果以某种方式更新 UI,例如将光标交换到适配器中。
如果你在onLoadDone中使用光标做了很多工作,那就是你自己的代码阻止了UI,而不是加载程序管理器。