Zinc #28 簡易的なHTTPリクエスト(AsyncTaskLoaderによる非同期処理)

非同期処理の練習をしたいので、とりあえずHTTPリクエストでソースを取得して表示してみる・・・。
(ソースの表示だったらわざわざHTTPで投げる必要はない・・・。単純にAsyncTaskLoaderの練習・・・。)

まずmenu_main.xmlで、

action_show_sourceを追加・・・。

strings.xmlは、

action_show_source_textは、"ソースの表示"・・・。
(ソースの表示って意外にもChromeにもないんだよなあ・・・。まあ、わざわざAndroidでソース見たいかって感じもするが・・・。)

で新しいクラスを追加する・・・。

f:id:BG1:20160731174410p:plain

で、

f:id:BG1:20160731174428p:plain

HttpRequestAsyncTaskLoaderを追加・・・。

あ、そうそう・・・。

前回のコードはコメントアウトしておいた・・・。

urlを取得して、Bundle型のargsにputStringで追加・・・。
getSupportLoaderManager().initLoaderに渡す・・・。
最初の引数は非同期処理のidで、今回は複数はやらないので0・・・。
2つ目にargs、3つ目はthisを指定・・・。
initLoaderでローダーを初期化(さらに中で非同期処理がスタートする)・・・。

MainActivityに、

LoaderManager.LoaderCallbacksを実装する・・・。
initLoaderすると、LoaderCallbacksインタフェースの、

onCreateLoaderが呼ばれる・・・。
argsからurlを取り出して、HttpRequestAsyncTaskLoaderのインスタンスを生成し、それを戻り値とする・・・。

HttpRequestAsyncTaskLoaderのコンストラクタで、まずは引数のcontextとurlをメンバにセット・・・。

で、このあとは、

onStartLoadingでローダーのローディングが開始される模様・・・。
ここでforceLoadを呼んで、バックグラウンド処理が実行される・・・。
ここはUIスレッドらしい・・・。

バックグラウンド処理の内容はloadInBackgroundに・・・。
urlを渡したURL.openConnectionでconnectionを開いて、HTTPメソッドはGET、リダイレクトは自動・・・。
(リダイレクトは、まあ今はどうでもいいや・・・。)
connection.connectで接続・・・。
これでリクエストは送られるようなので、

connection.getHeaderFieldsでヘッダをMapとして取得・・・。
一応、一つの文字列としてheaderStrに入れてるけど、今回はこれも使わない・・・。

connection.getInputStreamからのInputStreamReader経由でBufferedReaderのreaderを取得・・・。
reader.readLineでボディを取っていく・・・。

取れたresponseを戻り値として返すと、

MainActivityのonLoadFinishedが呼ばれ、第2引数のdataにresponseの文字列が格納されてるので、これを今回は簡単にToastで表示・・・。

f:id:BG1:20160731195032p:plain

このブログのURL・・・。

f:id:BG1:20160731195051p:plain

表示して、

f:id:BG1:20160731195102p:plain

メニューから"ソースの表示"・・・。

f:id:BG1:20160731195121p:plain

Toast.LENGTH_LONGにしてるのに、XperiaSPだと一瞬で消えてしまうのでキャプチャするのに苦労した・・・。
TONE m15だとそれなりに余裕があったのだが・・・。量が多いからかな・・・。
まあ、あくまで今回は試しの練習・・・。

https://github.com/bg1bgst333/Zinc/tree/develop/android/empty_activity/android_studio/src/Zinc