近い将来、こんな働き方になるだろうな、と想像をしてみます。 続きを読む
SourceHanCodeJP-ExtraLight
Sublime Text3 で SourceHanCodeJP-ExtraLight を読み込ませるとものすごく見やすい。
超超超マルチバイト
やっぱり開発者っていいなと思った話。
続きを読むPHP7の新機能が従来のPHPの型の曖昧さを防ぐので嬉しい件
歳を重ねるとプログラム言語のアップデートに脳みそがついていかなくなるという感覚をいだくPHP7のアップデートがあった。
WEBサーバーから取得したJSONデータ内のテキストや画像を複数表示する方法 手順1
手順1、新規Androidプロジェクト作成・Volleyをプロジェクトにインポート
JSON を吐き出す WEBサーバーの開発は割愛。
新規AndroidプロジェクトをVolleyTest という名前で作成します。
参考 : http://techfun.cc/android/firstandroid1.html
作成したプロジェクトに Volley をインポートします。
GoogleソースコードのVolleyダウンロードページの master というリンクから tgz のファイルをダウンロードし解凍します。
先ほど作成したプロジェクトツリーを右クリックして
File > Import > Android > Existing Android Code Into Workspace > Next とすすむ。
Root Directoryに先ほどダウンロードしたVolleyプロジェクトを指定 > Finish とすすむ。
これでひとまず完了。
次の手順で MainActivity でWEBサーバーにHTTP通信してJSONデータを取得できるかをためす。
WEBサーバーから取得したJSONデータ内のテキストや画像を複数表示する方法
Facebookアプリやニュースアプリのように、WEBサーバーから取得したJSONデータ内のテキストや画像を複数表示する方法
以前、WEBサーバーから取得したJSONデータを複数表示 という挑戦をしたところ、読み込む画像が増えてくると Out of Memory というアプリで使用出来るメモリーをオーバーするというメモリリークエラーが発生し、アプリが強制終了する症状が発生しました。
で、どうすればよいのかと調べたり有識者にお聞きした所、 bitmap を再利用したりして使用メモリのオーバーフローを防げば良い とのことです。。。。。うむぅ、、抽象的。
才能の無い小生は、具体的に小さな所からせめていきましょう。
以前のやり方(WEBサーバーから取得したJSONデータを複数表示)では、addView() でview を追加、追加、追加、、、 という方法だが、この無限に増えて行くview が原因でメモリのオーバーフローしてしまう。
どうやらこの方法ではアプリ内の全ての使用メモリをコツコツ管理しないとならなず開発が大変なので、これをやめる。
新しいやり方は、Googleが提供している
Volley
というネットワーク通信用ライブラリと
Lrucache
というメモリに画像データをキャッシュするためのクラスを利用して、WEBサーバーから取得したJsonデータをforでループしながらHashMap等に代入し、Adapter を介してListViewにセットするという方法だ。
そして受け取ったJSONデータを扱うのはGoogleが提供している
GSON
というライブラリがオススメです。
javaでjsonを扱うのはJSON-libやorg.jsonがあるのですが、配列からjsonに変換したりjsonの配列に追加したりするコードはGSONがとても便利です。
以下の参考URLでソースコードをパクりながらコーディングしていこう。
参考)
http://techbooster.org/android/hacks/16474/
http://techbooster.org/android/application/16792/
http://www.youtube.com/watch?v=pMRnGDR6Cu0&list=LLEVE0e9tHyTwhvz21X8KxtQ&feature=share
http://qiita.com/haratchatta/items/86aa8517a91fea1e772f
http://www.technotalkative.com/android-asynchronous-image-loading-in-listview/
WEBサーバーから取得したJSONデータを複数表示 手順6
手順6、レイアウトを綺麗にする
画面の見た目を綺麗にしたい。
今の状態だと10年前くらいにパソコン初心者が作成するホームページの見た目の様になってるので、もうすこし綺麗にしまひょ。
hogehoge_sub.xml を修正するよ。
・動作確認

ちょっと綺麗な見た目になったー。
ただ、気になるのは画像読み込み中に画像が読み込まれる予定の箇所に何も表示されないからレイアウトが押しつぶされている。。



うーーーん。
なんかちょっとなぁ。
画像が読み込まれる箇所にFacebookアプリみたいに空白の領域(プレースホルダー?)を表示させたいなぁ。
とりあえず画像が読み込まれる箇所にグルグル回転するプログレスバーを表示させたいな。
・プログレスバーを表示
HogehogeActivity.java を修正
hogehoge_sub.xml も修正
・動作確認


おぉー、WEBサイトっぽい。
WEBサーバーから取得したJSONデータを複数表示 手順5
手順5、タイトルをクリックしたり画像をクリックしたらナニガシする
そうだな、タイトル文字をクリックしたら該当の記事の itemId がトーストされるようにしてみよう。
かつ、アイコン画像をクリックしたら該当の記事の itemTitle がトーストされるようにしてみよう。
ループ処理の中で該当のIDが取得出来るかどうか、新しい処理を起動出来るかどうか??
以下HogehogeActivity.javaの修正箇所を赤文字で記載しました。
クリック動作を判別してくれる View.OnClickListener というインターフェース を利用したのです。
itemTitle_v.setClickable(true); でクッリックできるようにしてあげます。
itemTitle_v.setOnClickListener(itemTitleClickListener(itemId)); でクリックしたときにitemTitleClickListener()が実行されます。
関数の記述が我々PHP WEBエンジニアにとっては謎です。
private View.OnClickListener itemTitleClickListener(final String itemId)
・動作確認

ループ処理内での itemId が表示されました。
今度はアイコン画像をクリックしてみると、、

該当の記事がトーストされたー!やたー!
WEBサーバーから取得したJSONデータを複数表示 手順4
手順4、画像 http://なんちゃら.jpg を表示する、しかも非同期処理で
手順3では画面に文字列を出力することができたものの、http://なんちゃら.jpg の様な画像ファイルを表示する事ができてません。
HTML であれば <img src=”http://なんちゃら.jpg”> とすれば、ブラウザ上に表示してくれるのですが、世界はAndroidアプリですのでHTMLタグは使えません。
(WebViewというものを用いれば利用出来ますが・・)
Androidアプリでは ImageView と Bitmap を用いて画像を描画します。
また、画像データをインターネット経由で取得し秒がするという処理は少し時間がかかる処理なので、メインのUIスレッド(画面に文字を表示する処理)とは別の非同期のスレッド(画像を読み込んで読み込み終わったら画面に出力する処理)を走らせてあげる必要があります、とどっかのサイトに書いてありました。
・画像URLを画像として表示するためにレイアウトファイルの修正
・画像URLを画像として表示させるためのアクティビティを修正
・動作確認

・スクロールビュー
・動作確認

・非同期処理をアクティビティに埋め込む
さてここからですな。
非同期処理を実装してみよう。
非同期処理で重い処理(画像の読み込み・表示部分)を任せると、テキストデータだけパッと表示されて、しばらくすると画像が現れ始めるオシャレな動きになるはずや!
jqueryでいうところのajaxの様に、容量の大きな画像を読み込んでいる間やサーバー側の更新処理の完了待ちの間、画面を動かす事ができる。と。
やっぱり画面が固まるってのは、近年では”ダサい”と思われちゃう。大変な世の中です。
Android開発の必殺技AsyncTasc超基本形(超コピペ用)
このクラスを取り敢えずHogehogeアクティビティのプライベートクラスなどで定義してみます。
この書き方を最初に目にした時は
AsyncTask<Void, Void, Void> の部分と (Void… params) の部分が全く意味が分からず「うぅ!(嫌悪)」とドギマギしました。
引数にさ … って何やねん!しゃっきりせい! って。
大丈夫。これらの書き方は単なる 呪文(決まり事)らしいです。
ここでは説明を省きますが、詳しくはGoogle先生に聞いて下さいね(笑)
クラス名は、画像をロードするから LoadImageTask にしよっと。
HogehogeActivity.java に追記した所が赤文字、コメントアウトしたところが灰色です。
クラスの中にクラスがある!!
PHPエンジニアからするとあまり見ない記述。
まぁeclipseでシンタックスエラーになってないからいいか。
・動作確認



徐々に画像が読み込まれてスクロールバーも徐々に長くなっていった。
うまくできましたねぇ。
WEBサーバーから取得したJSONデータを複数表示 手順3
手順3、TextViewで文字列を表示してみる
ViewHolderを利用するとViewを使い回せてメモリの消費量が押さえ
・・えぇい やかましい!
今は表示出来るようになる、という所に重点を。
ListViewは単純に3項目くらいのテキストの表示項目をリスト表示するのにはとても便利かもしれませんが、今回のように1記事あたりに複数のテキストデータと複数の画像を表示しなければならない場合は、子ビュー(サブビュー)を記事テンプレートとしてメインビューにaddviewで下部に追加していく方法で実装してみようと思います。
・子ビューの作成
1記事毎のレイアウトファイルを新規作成します。
layout/hogehoge_sub.xml というファイル名にしよっと。
手順1の記事データを画面に表示してみます。
・HogehogeActivityを修正
・動作確認3
なぜかプログレスダイアログが表示されませんが、

記事のデータが画面に出力されました! わーい!
サーバーに通信してから画面表示するまでの数秒間、プログレスダイアログ(グルグル回るダイアログ)を表示したいのですが、表示されないのはUIスレッドでメインの処理を行っているからだそうです。
本当は、というか推奨としては、UIスレッドではHTTP通信を行うべきではないらしいので、追々直して行こう。
まずは表示できて嬉しいね。
補足)
強制終了してしまう場合はLogCatでエラーログを確認してみると
E/AndroidRuntime( 372): java.lang.NullPointerException
こんなエラーを頻繁に見かけます。
これは略してヌルポと呼ばれるエラーで、定義されていないオブジェクトを代入しようとしたりするとエラーになるようです。
ループ処理の中のjsonデータが空だったり、オブジェクトが生成されていない等が考えられます。
どこでそのエラーが起きているか?を調べるには
Log.d(“test abc”,”abc”);
というデバッグログ1行をソースコードに記述し、ログが出力されるかどうかを調べます。
該当のアクティビティを実行したときにLogCat上に
D/test abc( 768): abc
というデバッグログが出力されればていればその場所は通過しているという事になります。
少しずつ後の方に記述を持って行き、デバッグログが出力されなくなったら、その直前の処理に何か問題があるということになります。
あとはGoogle先生に聞いてエラーを潰します。

最近のコメント