3

多くのテスト中にAsyncTasks、データベースにアクセスするアプリが実行されており、キャンセルできません。テストの最後に、データベースを閉じて削除し、再度開いて、新しいデータベース フィクスチャを作成します。

問題はAsyncTasks、テストがデータベースを閉じて削除している間に がまだ実行されている場合、コードで実行時例外が発生することです。本番環境ではデータベースが閉じられないため、これが本番コードで発生することはありません。

Robotium にはfinishOpenedActivities、テスト ティアダウン メソッドで使用するというテスト ヘルパー メソッドがあります。すべての子スレッド (具体的には AsyncTasks) も確実に終了するように finishOpenedActivities を変更する方法があれば、非常に役立ちます。それ以外の場合は、信頼できるテストをサポートするためだけに、すべての AsyncTasks でキャンセルのチェックを実装する必要があります。

すべての子スレッド (具体的には AsyncTasks) が終了するまで待機する方法はありますか?

4

2 に答える 2

1

docsgetStatus()による方法があります。への参照が必要なだけです。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();
}
于 2012-08-23T15:12:08.290 に答える
0

データベースの問題を回避することになりましたが、これはツールに依存しているため、他の人にとっては有用であると思われます。私はデータベース アクセスにも OrmLite を使用しているため、PowerMock を介したリフレクションを使用してWhiteboxOrmLite のプライベート データベースinstanceCount変数にアクセスするロジックをテスト ティアダウン メソッド内に追加しました。開いているデータベース ハンドルの数を追跡します。ハンドル数が 1 になるまで待つだけで、データベースにアクセスしているスレッドが他にないことがわかります。

于 2012-08-23T15:30:58.517 に答える