我有一个ListView,我需要使用后台线程填充。该列表需要在每个项目被检索时更新。下面是我如何实现这个的一个非常简单的例子。AsyncTask访问Sqlite数据库导致崩溃
public class DownloadTask extends AsyncTask <MyUserObject, Integer, String>
{
@Override
protected MyUserObject doInBackground(MyUserObject... myUserObj)
{
MyUserObject muo = null;
int nCount = myUserObj.length;
if(nCount > 0)
muo = myUserObj[0];
muo.DownloadStuff();
return muo.getUserName();
}
protected void onPostExecute(String userName)
{
adapter.names.add(userName);
adapter.notifyDataSetChanged();
}
}
public class MyAdapterClass extends BaseAdapter
{
private ArrayList<String>names;
public MyAdapterClass(Context context)
{
names = new ArrayList<String>();
}
public fillList()
{
for(int i=0; i<users.length; i++)
{
DownloadTask task = new DownloadTask();
task.execute(users[i]);
}
}
在上述例子中,“适配器”是类型MyAdapterClass的目的,并且其fillList()方法是什么启动线程。在onPostExecute()中调用notifyDataSetChanged()会在数据到达时更新我的ListView。
问题是,我正在访问我在'doStackackground'中调用的DownloadStuff()中的sqlite数据库,并且有多个线程访问数据库导致它崩溃(如果我注释掉所有数据库活动在这里,那么它运行良好),下面是我如何努力,以解决这一问题,但它仍然崩溃。作为数据从后台线程检索到的我怎么能有我的ListView更新有什么建议?
Semaphore semaphore = new Semaphore(1, true);
public synchronized void DownloadStuff()
{
semaphore.acquire(1);
// ... DB operations ... //
semaphore.release(1);
}
它确实如果你能集中你的异步工作到一个更好的(并会避免同步问题^^ –
谢谢你,我不喜欢多个线程或错过了进展更新,这工作! –
我的新关注AsyncTask永远不会被销毁,即使Activity被销毁也是如此愤怒,东西告诉我,我不应该使用AsyncTask:s –