Android 访问Sqlite数据库的异步任务导致崩溃

Android 访问Sqlite数据库的异步任务导致崩溃,android,listview,synchronization,android-asynctask,Android,Listview,Synchronization,Android Asynctask,我有一个ListView,需要使用后台线程填充它。在检索每个项目时,列表需要更新。下面是我如何实现这一点的一个非常简单的示例 public class DownloadTask extends AsyncTask <MyUserObject, Integer, String> { @Override protected MyUserObject doInBackground(MyUserObject... myUserObj) { M

我有一个ListView,需要使用后台线程填充它。在检索每个项目时,列表需要更新。下面是我如何实现这一点的一个非常简单的示例

  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]);
         }
    }

我认为你的方法从一开始就是错误的。为什么要为必须添加到适配器的每个项目分别启动。用于通知gui适配器中新添加的项。在这种情况下,您希望同时访问数据库

我不确定(因为我真的很累),但我认为你的ot使用你的同步是正确的

每次执行异步任务时,您都会创建一个不同的MyUserObject实例,这意味着您从未在同一个实例上实际调用Downloadstuff,因此没有冲突,但另一方面,您的数据库在被多个MyUserObject调用时是唯一的,因此存在冲突

您要做的是在所有异步任务中使用相同的muo实例,这样,它们都会在同一实例上调用downloadstuff,然后进行同步,从而防止多重访问

你也不需要这里的语义


编辑:


Mojo Risin answer也很好,如果您可以通过将所有异步任务集中到一个任务中来避免麻烦,那么您应该这样做(运行在您周围的并发线程越少越好)

如果您可以将异步工作集中到一个任务中,那就更好了(并且可以避免同步问题^^谢谢,我也不喜欢多线程,错过了onProgressUpdate,这很有效!我新担心的是AsyncTask永远不会被破坏,即使活动被破坏了。很奇怪,有些事情告诉我我不应该使用AsyncTask:我不确定。AsyncTask对我很有帮助n当您必须在后台执行某些操作并在UI线程中返回结果时。您对AsyncTask有何顾虑。我刚刚注意到AsyncTask一直在运行(我可以在Debug视图中看到它),即使我的活动已被销毁,这也让我很担心。我已经看过其他关于此的帖子,现在我将检查添加到一些帖子推荐的“doInBackground”中的“IsCancelled()”。我想我不确定还需要解释什么,因为我知道AsyncTasks永远不会消亡。我没有机会尝试您的解决方案,因为我决定尝试并避免使用并发线程,谢谢您的评论!
 Semaphore semaphore = new Semaphore(1, true);

 public synchronized void DownloadStuff()
 {
     semaphore.acquire(1);
     // ... DB operations ... //
     semaphore.release(1);
 }