2011-08-12 2 views
0

を停止していません:AsyncTaskは、私は、データベースからのメッセージの履歴をロードし、デバイスの画面上に表示さAsyncTaskを作成しました

private void loadHistoryFromDB(Date lastUpdateDate) 
    { 
    final class DBAsyncTask extends AsyncTask<Void, Void, List<XMPPMessage>> 
    { 
     @Override 
     protected List<XMPPMessage> doInBackground(Void... arg0) 
     { 
      List<XMPPMessage> messages = null; 
      try 
      { 
       messages = PersistenceManager.getXMPPMessagesFromDB(userInfo, 0, messagingActivity); 
      } 
      catch (SQLException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (LetsDatabaseException e) 
      { 
       e.printStackTrace(); 
      } 
      return messages; 
     } 

正常に動作するようだが、実行された後、それが葉2スレッドを実行していると私はそのために活動を終了することはできません。どうすれば修正できますか?

答えて

2

タスクが正常に実行されている場合(onPostExecuteから終了)、これは心配する必要はありません。実行されると、AsyncTaskスレッドは、プラットフォームのバージョンに応じて、スレッドプールまたは単一スレッドの形で再利用される可能性があります。これはの通常のの動作です。これらは最終的にはクリーンアップ/再利用されます。

0

最初に、オーバーライドされたメソッド呼び出しの先頭にsuper.doInBackGround()を呼び出していることを確認してください。

これはそうでない場合は、データベースへの接続を維持している可能性が高いためです。

つまり、まだデータベースにロックが確立されています。

明示的にデータベースのロックを解除できるかどうか確認してください。問題が解決する可能性があります。

onPostExecute()メソッドに入れることができます。

+2

AsyncTask.doInBackgroundは()抽象メソッドであるので、それを呼び出す方法は、今そこにあります。 –

0

この問題は、AsyncTaskのキャンセルメソッドの周囲に混乱が生じている可能性が高いためです。

バックグラウンドタスクをループ可能なセグメントに分割し、各ループの繰り返しがタスクを開始する前に、タスクがキャンセルされているか、ループを解除する必要があるかどうかを確認する必要があります。 AsyncTaskの実行を停止させる他の方法はないようです。

私はここでのコード例でこの問題に詳しいガイドを掲載しました:

http://tpbapp.com/android-development/android-asynctask-stop-running-cancel-method/

関連する問題