非同期処理の練習をしたいので、とりあえずHTTPリクエストでソースを取得して表示してみる・・・。
(ソースの表示だったらわざわざHTTPで投げる必要はない・・・。単純にAsyncTaskLoaderの練習・・・。)
まずmenu_main.xmlで、
action_show_sourceを追加・・・。
strings.xmlは、
action_show_source_textは、"ソースの表示"・・・。
(ソースの表示って意外にもChromeにもないんだよなあ・・・。まあ、わざわざAndroidでソース見たいかって感じもするが・・・。)
で新しいクラスを追加する・・・。
で、
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で表示・・・。
このブログのURL・・・。
表示して、
メニューから"ソースの表示"・・・。
Toast.LENGTH_LONGにしてるのに、XperiaSPだと一瞬で消えてしまうのでキャプチャするのに苦労した・・・。
TONE m15だとそれなりに余裕があったのだが・・・。量が多いからかな・・・。
まあ、あくまで今回は試しの練習・・・。
https://github.com/bg1bgst333/Zinc/tree/develop/android/empty_activity/android_studio/src/Zinc