FC2ブログ

インターネットに接続する

2011年01月21日 20:53

Androidは、インターネットに接続しての利用が多いと思うから
その方法を簡単にメモ。

インターネット接続の方法は、結構やり方があるみたい。
・java.net
・android.net
・org.apache
に含まれる、ライブラリを使えば良いみたいだけど
使いどころがいまいちわからない。

java.netとAndroid.netは似てる?
android.net部分のドキュメントには

Classes that help with network access, beyond the normal java.net.* APIs.

ってあるから、java.netより機能は多そう。

今回は、インターネットの情報が何かしら取れればいいだけ出し
java.netのURLクラスで取得することにする。
URLクラスは通常のファイルと同様に扱えるから
RSSリーダー作ってみたいな~とか思ってるんで、こっちのほうが便利そう。

GETやPOSTをしたかったりする場合は、
http://gihyo.jp/dev/serial/01/androidapp/0009?page=1
あたりを参照

1.インターネット接続準備
AndroidManifest.xmlにインターネットへの接続許可を追加します。

2.URLクラスを使って接続

3.全体のサンプル
基本的にandoroidManifest.xmlに追加すること以外は,
Javaで作成するのとほとんど同じなのでJava関連でインターネットの連携を調べたほうが良さそう。

androidManifest.xml
mainActivity.java

非同期処理を行う ~part2 AsyncTaskの利用

2011年01月16日 13:27

前回はJavaと同じようなやり方で、スレッド処理をやった。
でも、Androidではメインスレッド以外で画面インターフェースを弄るような操作は出来ないし、画面インターフェースを操作するにはHandlerを利用するしかない。

Androidでは、このスレッド処理をうま~くやってくれるクラスがあるのでそちらを紹介。
たぶんこっちを使うほうがスタンダード?

1.AsyncTaskクラスを継承したクラスを作成する。
ここでGenericsというのを指定する。詳しくは、JavaのGenericsについて書いてる人がいると思うからそっち参照ってことで。
ざっと説明すると(後のSampleを見ればなんとなくイメージはつかめるかな?)
この部分は使わないから、型指定もしないって場合はVoidを指定すればいい。
・Params
スレッドが開始されたときに、渡す引数の型。(doInBackgroundメソッドの引数)
・Progress
進捗率を表示させるときに使う型。(onProgressUpdateメソッドの引数)
・Result
スレッド終了時に値を返す時の型。(onPostExecuteの引数・doInBackgroundの返り値)


2.メソッドを実装する。
↓メソッドを追加する(doInBackgroundが最低限実装されてればいい)
・doInBackground
バックグラウンドで実行させたい処理。
・onPreExecute
タスク開始直後に呼ばれる。
・onProgressUpdate
プログレスバーとかに進捗具合を更新したい場合はこの中に記述する。
・onPostExecute
スレッドが終了した後に呼ばれる。「完了!」とかTextViewなどに表示させたい場合はここに記述する。


3.タスクの作成・タスクの開始
そうしたらメインスレッドのほうで、作成したクラスのインスタンスを作り起動する。
4.Sample
ここまでだとよくわからないから、雛形のみのSanmpleで要素の確認をしてみる。
ちなみに、より詳しいことは
http://techbooster.jpn.org/application/1339/
http://labs.techfirm.co.jp/android/cho/1079
らへんを見てくれるとわかるかも。

とりあえず、AsyncTaskクラスだけの使い方で
他の余計な処理を極力省いてる感じで作ったが…

というか、よさそうなSampleがなかなか思い浮かばなかった。
他のごちゃごちゃした処理を省きたくても 作り出すとごちゃごちゃしちゃうんだよな~・・・orz
まぁ、大まかな流れがわかれば良いかなって感じで メモ的に書いといた

非同期処理を行う ~part1

2011年01月15日 15:20

Androidで非同期処理をやってみた。

でも、JavaにあるThreadのやり方をほぼそのまま
Android風に直しただけの簡単なものです。

Androidで時間がかかる処理を行うと、
一時的にインターフェースが固まったようになる。

インターフェースが固まってしばらくすると、
応答しません的なエラーメッセージが表示されて
強制終了を選択されると、処理中でも強制終了しちゃう。
そこで、非同期処理で画面系と処理を分けてこのエラーを出ないようにする。

スレッド処理をやるときの注意点として
メインスレッド以外で画面のインターフェースを変更しようとしないこと。
(たとえば、textViewの文字を別スレッドから終了メッセージを表示するとか)

Javaでのスレッド処理方法とかは、
http://www.tohoho-web.com/java/thread.htm
を参照。

別スレッドで、画面を変更したい場合はどうするかというと Handlerを利用する。
Handlerは、メインスレッドに「この処理やってください」って依頼する窓口みたいなもの。
こうやって画面は変更すればいい。

ってことで、ここのソース全文を載せると

Threadクラスを継承する場合と、Runnableインターフェースを実装する場合でも
どっちでも同じような感じで作成できる。

でも、AsyncTask クラスというのがあるみたいなので
スレッド処理はそっちでやったほうが良さそう。
次回あたりはここらへんを書きたい。

任意データの置き場所は、/assets or /res/raw?

2011年01月10日 16:00

レイアウト、アイコン、xmlファイルなど
一部のファイルは保存場所は決められているけど

任意のデータファイル(自作のテキストファイルとか)の置き場所の候補が
/res/raw と /assetsの2つあるから
どっちがいいの?ってことで調べてみた。

まぁ、ディレクトリ名を直訳すれば
/res/raw:未加工のリソース
/assets:財産
ってことになるけど…

ここの右下に、小さく書かれていた(Access to Original Files部分)
http://developer.android.com/intl/ja/guide/topics/resources/accessing-resources.html

/rawの項目に書かれていたことを元にまとめた。
http://developer.android.com/intl/ja/guide/topics/resources/providing-resources.html

【/res/raw】
・リソースIDで管理されている。(R.layout.~とかが使える。)
・アプリ側から保存できない。
・ファイル名制限あり(a~zの小文字、アンダーバー、ピリオドのみ)
・/raw以下にディレクトリを作成が出来ない。

【/assets】
・リソースIDは振られていない。(リソースIDを渡すメソッドとかが使えない。)
・アプリ側から保存できる。
・自由にファイル名が付けれる。
・/assets以下にディレクトリを作成できる。


/assetsの方は、IDで管理されていないからメモリの節約になるみたい。
また、名前制限もなく、ディレクトリで管理したいとかなら
/assetsに置いたほうが良さそう。

ここまで書いたら、/res/rawの使いどころが全然わからなくなった・・・orz
置き場所が決められていないオリジナルファイルとかは、全部/assetsに置けば良いような気がしてきた。

まぁ、最終的にはリソースの量と
読み込む時に使うメソッドとかの違いで使いやすいほうを選ぶのかな?

よくわからなかったらとりあえず、
オリジナルファイルは/assetsに置けば良いということで。

ファイル参照のやり方。
/res/raw
/assets

SQLITEを使うpart2 ~DB操作

2011年01月10日 02:19

前回、DBを作成したので今回はDBを操作して
データの読み取り、挿入、削除、更新を行う。

1.DB操作前に

前回作成したSQLiteOpenHelperを継承したクラスのオブジェクトを作成し、 getWritableDatabase()でDBを書き込み可能(Selectの場合は読み取り専用でもOK)で開く。

今回は、これの戻り値を取得しとく。
(前回は、DBの構造を作成するだけの目的だったので呼ぶだけでよかった。)


2.データの挿入(Insert)
↓使用メソッド
table
テーブル名を指定する。
nullColumnHack
基本的にNullを指定する。
(少し調べたけど、使い方がよくわからない。すべてのフィールドがNullを許可している場合、全フィールドでNullのレコードを作成するのは出来ないから何かしら値を明示的に指定しなければいけない。とかなんとか…わかる人いたら教えてください。 でも、フィールドに入れる値は原則意識して設定すべきというのを前提にすればこの引数はnullを指定しとけばいいかな)
values
登録する値を設定した、ContentValuesインスタンスを指定する。
戻り値
Insertに失敗した場合は、-1を返す。それ以外は、挿入したレコード位置

↓使用例

3.データの更新(Update)
↓使用メソッド
table
テーブル名を指定する。
values
登録する値を設定した、ContentValuesインスタンスを指定する。
whereClause
SQLのWhere区に相当する部分を指定する。(検索条件)
whereArgs
whereClauseで"?"にした場合の、置き換えに使う。
戻り値
更新件数を返す。updateに失敗した場合は、-1を返す。

↓使用例①
↓使用例②
4.データの削除(Delete)
↓使用メソッド
table
テーブル名を指定する。
whereClause
SQLのWhere区に相当する部分を指定する。(検索条件)
whereArgs
whereClauseで"?"にした場合の、置き換えに使う
戻り値
削除した件数を返す。それ以外は0を返す。

↓使用例(whereArgsの指定の仕方は、updateと同じだから1個だけ)
5.データ抽出(Select)
データ抽出には、2種類方法があるけど好きなほうを使えばいい。
(SQL文を作るのに慣れているならrawQueryのほうが使いやすいかな?)
また、Selectは戻り値にカーソルを受け取る。
(カーソルとかの説明は、SQLについての解説を見てってことで…)
↓使用メソッド①
sql
SQL文を記述する。
selectionArgs
sqlで"?"にした場合の、置き換えに使う。

↓使用例①
↓使用メソッド②
distinct
レコードの重複を除外する場合は、Trueを指定する
table
テーブル名を指定する
columns
抽出するフィールドを指定する。
selection
SQLのWhere区に相当する部分を指定する。(検索条件)
selectionArgs
selectionで"?"にした場合の、置き換えに使う。
groupBy
SQLのgroupBy区に相当する部分を指定する。
having
SQLのhaving区に相当する部分を指定する。
orderBy
SQLのorderBy区に相当する部分を指定する。
limit
検索結果レコード数の上限を指定する。
戻り値
抽出結果のカーソルを返す。

↓使用例②
↓カーソル取得後のデータ取得方法例 コメント読めば何やってるかはわかってもらえると思う。
6.Select以外で共通して使える
↓使用メソッド
sql
SQL文を書く
bindArgs
SQLに"?"を指定した場合の置き換えに使う

ここらへんは、上と似たようなものだから使用例は省略

8.大量のデータを操作したい・トランザクション管理したい
上までのやり方は、常に一つ一つ更新していくメソッド。でも一つでも失敗したらすべてロールバックする時のやり方。それにこっちのほうが、commitが一回だけの分高速です。
↓使用例
トランザクション終了までに、コミットされていなければ自動でロールバックする。
これが一番個人的には使い勝手が良いような気がする。

9.最後にDBのクローズは忘れずに
でDBをオープンしたら、使われなくなった段階で クローズさせるようにしたほうがいい。

↓に今回いろいろ実験したソースを載せとく (エラー処理とか、ほとんどやってないけど) 今回、こんなにがんばるつもりじゃなかったんだが…(疲れたorz)
[SQLITEを使うpart2 ~DB操作]の続きを読む