我的安卓应用程序中,用户可以填充导入的数据到数据库中,然后执行预定义的、复杂的SQL查询。对于某些数据模式,查询将需要很长时间(在HTC Hero上可能需要数分钟以上),而常见用法则不超过10-15秒。
有没有办法在安卓上取消待处理的SQLite查询?超时也是可以的,不需要部分结果。我是在AsyncTask.doInBackground()
中执行查询的。
我知道最好的方式是优化查询或改变应用逻辑,但在这种情况下,结果仍取决于用户的知识水平,所以我想帮助那些遇到问题的用户。
ASyncTask支持取消操作,标志应该包括所有内容,包括您的SQL查询。
ASyncTask.cancel(boolean mayInterruptIfRunning)
android.os.CancellationSignal
取消在sqlite上运行的查询,该信号可以传递给android.database.sqlite.SQLiteDatabase
的某些方法。
doInBackground()
的代码仍然被保留,因为 AsyncTask 流通过onCancelled()
返回,但 Cursor 仍然停留在moveToFirst()
上并占用了整个 CPU。 我试图关闭 SQLiteDatabase 或 SQLiteOpenHelper,但调用这些对象中的任何一个都会阻塞执行,直到moveToFirst()
完成。而且,Cursor 没有“取消”方法。 - tomash