我创建了一个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;
}
它似乎工作正常,但在执行后,它会留下2个正在运行的线程,因此我无法完成活动。我该如何解决?
答案 0 :(得分:2)
只要您的任务正常执行(退出onPostExecute
),这不应该是您必须担心的事情。一旦执行,AsyncTask
线程将坚持可能以线程池或单线程的形式重用,具体取决于平台版本。这是正常行为 - 它们最终会被清理/重复使用。
答案 1 :(得分:0)
首先,请确保在覆盖的方法调用顶部调用super.doInBackGround()
。
如果不是这样,可能是因为您正在维护与数据库的连接。
也就是说,您仍然在数据库上建立了锁。
看看您是否可以明确解锁数据库,这可能会解决您的问题。
您可以将其放在onPostExecute()
方法中。
答案 2 :(得分:0)
这个问题很可能是由于围绕AsyncTask取消方法的混淆。
您需要将后台任务分解为可循环段,然后在每次循环迭代开始执行任务之前,您需要检查任务是否被取消以及是否需要中断循环。似乎没有任何其他方法可以阻止执行AsyncTask。
我已经在此处发布了有关此问题的详细指南:
http://tpbapp.com/android-development/android-asynctask-stop-running-cancel-method/