Android 异步任务不';停不下来

Android 异步任务不';停不下来,android,android-asynctask,Android,Android Asynctask,我创建了一个AsyncTask,它从数据库加载消息历史记录,然后在设备屏幕上显示: private void loadHistoryFromDB(Date lastUpdateDate) { final class DBAsyncTask extends AsyncTask<Void, Void, List<XMPPMessage>> { @Override protected List<XMPPMessage

我创建了一个AsyncTask,它从数据库加载消息历史记录,然后在设备屏幕上显示:

private void loadHistoryFromDB(Date lastUpdateDate)
    {
    final class DBAsyncTask extends AsyncTask<Void, Void, List<XMPPMessage>>
    {
        @Override
        protected List<XMPPMessage> doInBackground(Void... arg0) 
        {
            List<XMPPMessage> messages = null;
            try 
            {
                messages = PersistenceManager.getXMPPMessagesFromDB(userInfo, 0, messagingActivity);
            }
            catch (SQLException e) 
            {
                e.printStackTrace();
            } 
            catch (LetsDatabaseException e)
            {
                e.printStackTrace();
            }
            return messages;
        }
private void loadHistoryFromDB(日期lastUpdateDate)
{
最后一个类DBAsyncTask扩展了AsyncTask
{
@凌驾
受保护列表doInBackground(无效…arg0)
{
列表消息=null;
尝试
{
messages=PersistenceManager.getXMPPMessagesFromDB(userInfo,0,messagingActivity);
}
捕获(SQLE异常)
{
e、 printStackTrace();
} 
捕获(LetsDatabasee异常)
{
e、 printStackTrace();
}
返回消息;
}

它似乎工作得很好,但在执行之后,它留下了两个正在运行的线程,因此我无法完成活动。如何修复它?

首先,确保在重写的方法调用顶部调用了
super.doInBackGround()

如果不是这样,很可能是因为您正在维护与数据库的连接

也就是说,您仍然在数据库上建立了一个锁

看看是否可以显式解锁数据库,这可能会解决您的问题


您可以将其放在
onPostExecute()
方法中。

只要您的任务正确执行(从
onPostExecute
退出),就不必担心这一点。一旦执行,
AsyncTask
线程根据平台版本,将以线程池或单线程的形式保留可能的重用。这是正常的行为-它们最终将被清理/重用。

此问题最有可能是由于围绕AsyncTask的取消方法的混乱

您需要将后台任务分解为可循环段,然后在每次循环迭代开始执行任务之前,您需要检查任务是否已取消,以及是否需要中断循环。似乎没有其他方法可以停止异步任务的执行

我在这里发布了一个关于这个问题的详细指南和代码示例:

AsyncTask.doInBackground()是一个抽象方法,所以现在有了调用它的方法。