如何在游标中使用Thread?

时间:2014-07-07 13:17:30

标签: android multithreading sqlite android-cursoradapter

如何在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();
                }

1 个答案:

答案 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;
    }
}

CursorAdapter

准备好后,将使用光标调用onLoadFinished,然后您就可以了。使用它并停止。