Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用AsyncTask加载SQLite数据,我做错了什么?_Android_Android Asynctask_Android Sqlite_Loader - Fatal编程技术网

Android 使用AsyncTask加载SQLite数据,我做错了什么?

Android 使用AsyncTask加载SQLite数据,我做错了什么?,android,android-asynctask,android-sqlite,loader,Android,Android Asynctask,Android Sqlite,Loader,我是android和java新手,我正在尝试实现一个异步加载程序。但没有加载任何数据。我在概念上遗漏了什么吗 我的活动: public class TestActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { ListView bookList; MyCursorAdapter myAdapter; @Override protected void onCre

我是android和java新手,我正在尝试实现一个异步加载程序。但没有加载任何数据。我在概念上遗漏了什么吗

我的活动:

public class TestActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {


ListView bookList;
MyCursorAdapter myAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_admin_library);
  //  dloader = new DBLoader(this);
    //dloader.loadInBackground();

   /* blah blah*/

    getSupportLoaderManager().initLoader(1,null,this);

    /* blah blah*/
    View header = (View) getLayoutInflater().inflate(R.layout.row_layout_title, null);
    TextView totals = header.findViewById(R.id.mainText);
    totals.setText("Total Books: " + Integer.toString(totalBooks));
    bookList.addHeaderView(header);

    bookList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            /* blah blah*/
            }


        }
    });
    /* blah blah*/
}

 /* blah blah*/

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
   /*CursorLoader loader = new CursorLoader(this, null, null, null, null, null){
        @Override
        public Cursor loadInBackground(){
            DBHandler db = new DBHandler(getContext());
            return db.getCursor();
        }
   };*/
   DBLoader loader  = new DBLoader(this);
    return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    myAdapter = new MyCursorAdapter(this,data,0);
    bookList.setAdapter(myAdapter);
    // myAdapter.swapCursor(data);
    //myAdapter.notifyDataSetChanged();
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    myAdapter.swapCursor(null);

}
}

DBLoader
声明为全局变量

在创建加载器上的
onCreateLoader

loader  = new DBLoader(this);
return loader;
将其置于
onCreate
方法中,而不是
onLoadFinished

myAdapter = new MyCursorAdapter(this,null,0);
bookList.setAdapter(myAdapter);
将其置于
onLoadFinished

this.loader=(DBLoader)loader;
adapter.changeCursor(cursor);

经过一些搜索,我在网上看到了一些他们使用的例子 a
getSupportLoaderManager().initLoader(1,null,this.forceLoad()。这似乎奏效了。在
onCreateLoader()
中调用
loader.forceLoad()
也同样有效。进一步检查后,我发现:

似乎我们必须在
onStartLoading()
中实现
forceLoad
,如下所示:

protected void onStartLoading() { 
if (mCursor != null) { 
    deliverResult(mCursor); 
} 
if (takeContentChanged() || mCursor == null) { 
    forceLoad(); 
} 
} 

这样做将不再需要在我们的活动中使用
.forceLoad()
,请参见
CursorLoader
sources-
onStartLoading
,尤其是
DBHandler
MyCursorAdapter
class@OussemaArouaDBHandler相当大。我已经使用DBHandler在UI线程上获取游标,它可以正常工作。getCursor()从数据库加载游标。我将上传适配器我已经使用适配器和dbhandler成功地在UI线程中加载了数据。而不是使用
MyCursorAdapter
只需使用
SimpleCorsorAdapter
作为全局变量,对吗?我试着把它作为一个普通的类变量和一个
静态变量。没有错误日志吗?尝试记录光标是否为空或未解决它(不知何故?)。将
.forceLoad()
添加到
getSupportLoaderManager
中可以实现这一点。(这可能会导致装载机在方向改变时重新加载…)
this.loader=(DBLoader)loader;
adapter.changeCursor(cursor);
protected void onStartLoading() { 
if (mCursor != null) { 
    deliverResult(mCursor); 
} 
if (takeContentChanged() || mCursor == null) { 
    forceLoad(); 
} 
}