Android 异步任务不';停不下来
我创建了一个AsyncTask,它从数据库加载消息历史记录,然后在设备屏幕上显示: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
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()是一个抽象方法,所以现在有了调用它的方法。