我能否确定一个活动是否正在运行AsyncTasks?

3
在我的许多测试中,我的应用正在运行访问数据库且无法取消的 AsyncTasks.在测试结束时,我关闭数据库、删除它,然后重新打开它以获得一个新的数据库固件。
问题是,当 AsyncTasks 在测试关闭和删除数据库时仍在运行时,代码会产生运行时异常。这在生产代码中永远不会发生,因为数据库从未在生产中关闭。
Robotium 有一个名为 finishOpenedActivities 的测试帮助方法,我在测试拆卸方法中使用它。如果有一种方法可以修改 finishOpenedActivities 确保所有子线程(特别是 AsyncTasks)也已完成,那将非常有帮助。否则,我可能要去实现所有 AsyncTasks 中的取消检查,以支持可靠的测试。
是否有一种方法等待所有子线程(特别是 AsyncTasks)都完成?
2个回答

1

根据文档,有一个getStatus()方法。你只需要一个对AsyncTask的引用。

AsyncTask<Void, Void, Void> yourAsyncTask = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... arg0) {
        // your async code           

        return null;
    }

};

if (yourAsyncTask.getStatus() == AsyncTask.Status.RUNNING) {
    // What ever you need to do if still running ex.

    yourAxyncTask.cancel();
}

0

虽然这个问题与数据库有关,但我最终绕过了它,不过这对其他人来说可能很依赖工具。我还使用OrmLite进行数据库访问,因此我在测试拆卸方法中添加了逻辑,通过PowerMock的Whitebox反射访问OrmLite的私有数据库instanceCount变量。它跟踪有多少个数据库句柄是打开的。我只需等到句柄计数降至1,然后我就知道没有其他线程访问数据库了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接