Android 使用AsyncTask加载SQLite数据,我做错了什么?
我是android和java新手,我正在尝试实现一个异步加载程序。但没有加载任何数据。我在概念上遗漏了什么吗 我的活动: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
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();
}
}