我可以确定某个活动是否已运行AsyncTasks吗?

时间:2012-08-23 12:44:15

标签: android testing android-asynctask integration-testing robotium

在我的许多测试中,我的应用程序正在运行访问数据库的AsyncTasks,无法取消。在我的测试结束时,我关闭我的数据库,删除它,然后重新打开它,所以我有一个新的数据库夹具。

问题是,当AsyncTasks恰好在测试关闭和删除数据库期间仍在运行时,我将在代码中获得运行时异常。这在生产代码中永远不会发生,因为数据库永远不会在生产中关闭。

Robotium有一个名为finishOpenedActivities的测试辅助方法,我在我的测试拆解方法中使用它。如果有一些方法可以修改finishOpenedActivities以确保所有子线程(特定于AsyncTasks)也已完成,那将非常有用。否则,为了支持可靠的测试,我可能不得不在所有AsyncTasks中取消实施检查。

是否有某种方法可以等到所有子线程(特定于AsyncTasks)完成?

2 个答案:

答案 0 :(得分:1)

根据docs,有一种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();
}

答案 1 :(得分:0)

我最终回避了数据库问题,尽管这对于其他任何可能发现有用的工具都非常依赖于工具。我还使用OrmLite进行数据库访问,因此我在测试拆解方法中添加了逻辑,该方法使用PowerMock的Whitebox反射来访问OrmLite的私有数据库instanceCount变量。它会跟踪打开的数据库句柄数。我只是等到句柄数减少到1,然后我知道没有其他线程访问数据库。