3

Unable to destroy activity xxx: android.database.sqlite.SQLiteException: unable to close due to unfinalised statementsアクティビティが破棄されているときにエラーが発生します。これは、AsyncTasks 内からデータベース操作を実行していて、完了前に何らかの形で強制終了されているためだと思います。

AsyncTasksアクティビティが停止する前に、実際に完了したことを確認するにはどうすればよいですか? ちなみに、チェックで同意し ないと、 anAsyncTaskを明示的に殺すことはできないと思いました。AsyncTask

このエラーは、Robotium 統合テスト中に発生している可能性があります。テストが完了してテストが呼び出された後に発生していると思われますRobotium.finishOpenedActivities()。私の推測では、AsyncTaskこれが可能な場合、どういうわけか実行中に強制的に殺されているということです (ただし、私のAsyncTask実装ではキャンセルを明示的にサポートしていません)。さらに、データベースへのアクセスには OrmLite を使用しています。

4

3 に答える 3

2

onPause()アクティビティでイベントをオーバーライドし、オーバーライドされた 内からonPause()を呼び出すとcancel(false)、が完了 AsyncTasksするまでアクティビティが破棄されないように見えます。AsyncTasks

于 2012-08-07T22:05:46.570 に答える
0

ここでできることはいくつかあります。

  1. これらのメソッドをオーバーライドして、オブジェクトが閉じられたときの状態を正確に判断してください。AsyncTask が完了すると、onPostExecute が呼び出されるようです。呼び出されていない場合は、早すぎます。

    protected void onProgressUpdate(Integer... progress) {
       setProgressPercent(progress[0]);
    }
    
    protected void onPostExecute(Long result) {
    }
    
  2. 次のように実行することもできます。

    // with THREAD_POOL_EXECUTOR.
    executeOnExecutor(java.util.concurrent.Executor, Object[]) 
    
  3. ドキュメントの最初の 2 つのルールに従っていることを確認してください: 1 と 2 に従っていますか?

    このクラスが正しく機能するためには、いくつかのスレッド化ルールに従う必要があります。

    1. AsyncTask クラスを UI スレッドにロードする必要があります。これは、JELLY_BEAN の時点で自動的に行われます。

    2. タスク インスタンスは、UI スレッドで作成する必要があります。

    3. execute(Params...) は UI スレッドで呼び出す必要があります。

    4. onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...) を手動で呼び出さないでください。

    5. タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

于 2012-08-06T17:26:49.140 に答える