読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

AsyncTaskLoader

Androidアプリを作った時にAsyncTaskLoader使って非同期でHTTP通信させたら変なことになったのでメモ

画面上のボタンを押したらHTTP通信を発生させるように実装したんだが2つほど不具合発生。。。

2回目以降はボタンを押しても通信が発生しない

ただ、↓のような感じで実装した通信終了時に出るToastは表示される

@Override
public void onLoadFinished(Loader<HashMap<String, Object>> loader, HashMap<String, Object> data) {
  hogeView.showMessage("xxxxx");  // Toastを使って文字列を表示させるメソッド
}
原因

同じIDのloaderが既にinitLoader()で生成されている場合、onCreateLoader()が実行されない

解決策

1. HTTP通信を発生させる度にIDの異なるloaderを生成する
2. HTTP通信が終わったらloaderを削除する

自分はもう1つの不具合のこともあって2を選択。まぁ普通は2なのかな〜

@Override
public void onLoadFinished(Loader<HashMap<String, Object>> loader, HashMap<String, Object> data) {
  hogeView.showMessage("xxxxx");  // Toastを使って文字列を表示させるメソッド
  getLoaderManager().destroyLoader(LOADER_ID); // ID=LOADER_IDのloaderを削除
}

アプリ起動のままAndroidがスリープ → 解除でHTTP通信が発生する

原因

不明。。w

ん〜根本の原因は分からないままなんだが、どうやらloaderが生成されてたら実行されてしまうっぽい

解決策

とりあえずまぁそういうことでHTTP通信が終わったらloaderを削除するようにした

まぁ↑の対応といっしょだな。用済みのはちゃんと消しましょうということですな