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を削除するようにした
まぁ↑の対応といっしょだな。用済みのはちゃんと消しましょうということですな