如何在Thread
中使用Cursor
。例如,我们有这个代码:
cursor = sql.rawQuery(OUR QUERY..., null);
if (cursor.moveToFirst()) {
do {
SOME CODE....
} while (cursor.moveToNext());
}
我们可以使用吗?
if (cursor.moveToFirst()) {
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
do {
SOME CODE....
} while (cursor.moveToNext());
}
});
thread.start();
}
答案 0 :(得分:2)
您可以使用CursorLoader
而不是使用Thread类(尽可能避免使用它。)
您的活动将实施LoaderManager.LoaderCallbacks<Cursor>
,其中包含您需要的所有回调。
然后,您需要使用他的initLoader
方法初始化CursorLoader。
private static final int LOADER_ID = 1;
getLoaderManager().initLoader(LOADER_ID, null, this);
它的论点是:
int id, Bundle args, LoaderCallbacks<D> callback
ID:
此加载程序的唯一标识符。可以是你想要的任何东西。标识符的范围限定为特定的LoaderManager实例。
这是你使用的号码,我使用了1。
捆绑
在构造时提供给加载程序的可选参数。如果加载器已存在(不需要创建新加载器),则将忽略此参数,并继续使用最后一个参数。
如果你需要提供论据,那就是正确的论点。
回调
接口LoaderManager将调用报告加载器状态的变化。需要
它是我们的Activity类,因为它充当回调。
在此行之后,调用onCreateLoader
并且它将包含两个参数:loaderID, bundle
我认为你可以理解它是什么。
然后,您可以如何实施onCreateLoader
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle)
{
/*
* Takes action based on the ID of the Loader that's being created
*/
switch (loaderID) {
case LOADER_ID: // our ID!
// Returns a new CursorLoader
return new CursorLoader(
getActivity(), // Parent activity context
mDataUrl, // Table to query
mProjection, // Projection to return
null, // No selection clause
null, // No selection arguments
null // Default sort order
);
default:
// An invalid id was passed in
return null;
}
}
准备好后,将使用光标调用onLoadFinished
,然后您就可以了。使用它并停止。