FC2ブログ
HOME   »  2011年06月
Archive | 2011年06月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Android]Handlerクラスのまとめ

UIの操作を別スレッドから実行する時に使用するHandlerクラスについてのまとめ。

○postメソッド
HandlerクラスのインスタンスはUIスレッドで取得する。
取得した(Handlerクラスの)インスタンスのpostメソッドは別スレッドで実行する。
postメソッド実行により、postメソッドの引数に設定したRunnable(インタフェースを実装した)クラスのrunメソッドがUIスレッドで実行されるので、runメソッドでUI操作コードを実装することにより、別スレッドからのトリガによるUI操作ができる。

○sendEmptyMessageメソッド
Handlerクラスを継承したクラスのインスタンスはUIスレッドで取得する。
取得した(Handlerクラスを継承したクラスの)インスタンスのsendEmptyMessageメソッドは別スレッドで実行する。
sendEmptyMessageメソッド実行により、Handlerクラスを継承したクラスのhandleMessageメソッドがUIスレッドで実行されるので、handleMessageメソッドをオーバーライド(UI操作コードを実装)することにより、別スレッドからのトリガによるUI操作ができる。

○sendMessageメソッド
使い方はsendEmptyMessageメソッドと同じ。
引数としてMessageクラスのインスタンスを渡すことができるので、別スレッドからUIスレッドへ情報を渡すことができる。

○postDelayed/sendEmptyMessageDelayed/sendMessageDelayedメソッド
使い方はそれぞれpost/sendEmptyMessage/sendMessageメソッドと同じ。
第2引数に設定した時間分実行を遅らせることができる。

○postAtTime/sendEmptyMessageAtTime/sendMessageAtTimeメソッド
使い方はそれぞれpost/sendEmptyMessage/sendMessageメソッドと同じ。
第2引数で実行する時間を指定することができる。


スポンサーサイト

[Java]正規表現を使用した文字列抽出 その2

以前の記事「正規表現を使用した文字列抽出」は、丸括弧()で挟まれた文字列を丸括弧含めて抽出する方法だったが、これを少し修正して、今度は丸括弧を省いて挟まれた文字列のみを抽出する方法。

正規表現では、パターン内の一部を丸括弧で挟むことによりグループ化することができる。
前回使用したパターンを表す文字列"\\(.+?\\)"の中で、今回抽出したい「丸括弧で挟まれた文字列」を表す部分".+?"を丸括弧で挟んで以下の様にグループ化する。

"\\((.+?)\\)"

それからもう1ヶ所、パターンにマッチした文字列を取得するMatcherクラスのgroupメソッドの引数で、取得したいグループの番号(1番目のグループを表す"1")を指定する。
String regex = "\\((.+?)\\)";
String target = "(abeshi)and(hidebu)";
List<String> omaewamoshindeiru = new ArrayList<String>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(target);
while (matcher.find()) {
    omaewamoshindeiru.add(matcher.group(1));
}
これで、omaewamoshindeiruには以下文字列が格納される。

abeshi
hidebu


[Android]SDカードに書き込む時のパーミッション設定

アプリケーションからSDカードに何らかのデータを書き込める様にする為には、Wi-Fi機能を使用する時と同様に、

android.permission.WRITE_EXTERNAL_STORAGE

というパーミッション設定を以下の様にAndroidManifest.xmlに追加する必要がある(7行目)。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="xxxxxxx"
          android:versionName="1.0.0" android:versionCode="1">
    <uses-sdk android:targetSdkVersion="4" android:minSdkVersion="4"/>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="xxxxxxx.MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
尚、このパーミッション設定はAndroid 1.6から必要になったらしい。


[Android]SDカードのパスを取得する

アプリケーションからSDカードにデータ等を保存したい時、保存先としてSDカードのパスを知る必要がある。

特定の端末のみを対象とするのであれば、その端末固有のパスを直接指定する方法もあるが、汎用的なアプリケーションとしたい場合は、それでは都合が悪い。

そんな時は、EnvironmentクラスのgetExternalStorageDirectoryメソッドとFileクラスのgetPathメソッドを使用すればよい。

まず、EnvironmentクラスのgetExternalStorageDirectoryメソッドでSDカードについてのFileクラスのインスタンスを取得し、取得したFileクラスのインスタンスからgetPathメソッドによりSDカードのパスを表す文字列を取得する。
File sdCardFile = Environment.getExternalStorageDirectory();
String sdCardPath = sdCardFile.getPath();


[Java]メソッドチェーン

あるクラスのメソッドが、戻り値としてそのクラスのインスタンスを返す場合、記述にメソッドチェーンを利用することができる。

AndroidでAlertDialogを表示する時に使用するAlertDialog.Builderクラスもその1つ。
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Title")
    .setMessage("Message")
    .setPositiveButton("Yes",
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ごにょごにょ(PositiveButtonが押された時の処理)
            }
        })
    .setNegativeButton("No",
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ごにょごにょ(NegativeButtonが押された時の処理)
            }
        })
    .setCancelable(false)
    .show();
上記は2つのボタン(PositiveButtonとNegativeButton)を持ったAlertDialogを表示する時の例だが、AlertDialogの挙動などの設定を行う各メソッド(setほにゃらら)の戻り値がAlertDialog.Builderクラスのインスタンス(上記例ではalertDialogBuilder)なので、この様にメソッドを続けて記述することができる。

初めてこの記述を見た時は「ん?」となったが、これはこれで便利かもしれない(コードの読みやすさを犠牲にすれば、1行で記述できる)。


[Java]クラスのListを任意の条件でソートする

クラスのListを任意の条件でソートしたい時の方法。

ListのソートはCollectionsクラスのsortメソッドで可能だが、Comparator<T>インタフェースを実装したクラスを作成し、2つの引数を取るsortメソッドの第2引数にこの自作クラスのインスタンスを渡してやることにより、任意の条件でのソートが可能となる。
ソート条件は、自作クラスのcompareメソッドで実装する。

例えば以下の様なHogeクラスがある。
public class Hoge {
    public int index;
    public int value;

    public void method() {
        ごにょごにょ(methodメソッドで行う処理)
    }
}
このHogeクラスのListを、

・indexフィールドの値での昇順
・indexフィールドの値が等しい場合はvalueフィールドの値での降順

という条件でソートしたい。

まず、Comparator<T>インタフェース(Tはソート対象となるHoge)を実装したHogeComparatorクラスを作成する。
public class HogeComparator implements Comparator<Hoge> {
    @Override
    public int compare(Hoge o1, Hoge o2) {
        Integer index_1 = new Integer(o1.index);
        Integer index_2 = new Integer(o2.index);
        Integer value_1 = new Integer(o1.value);
        Integer value_2 = new Integer(o2.value);
        int result;
        result = index_1.compareTo(index_2);
        if (result == 0) {
            result = value_2.compareTo(value_1);
        }
        return result;
    }
}
まず10行目で、2つのHogeクラスのindexフィールド値を比較する。
compareToメソッドは引数の方が小さい場合は正の値、大きい場合は負の値、等しい場合は0を返す。
この自作クラスのcompareメソッドの戻り値が正の値の場合はo2→o1の順、負の値の場合はo1→o2の順にソートされるので、index_1 > index_2の場合はo2→o1の順、index_1 < index_2の場合はo1→o2の順、つまり昇順でソートされる。

index_1 = index_2の場合(12行目が真の場合)は、今度は13行目でvalueフィールド値を比較する。
value_1 > value_2の場合はcompareメソッドの戻り値が負の値になるのでo1→o2の順、value_1 < value_2の場合はcompareメソッドの戻り値が正の値になるのでo2→o1の順、つまり降順でソートされる。

以上の自作クラスを以下の様に使用すれば、希望の条件でソートすることができる。
List<Hoge> hoges = new ArrayList<Hoge>();
HogeComparator comparator = new HogeComparator();
ごにょごにょ(hogesに要素を格納する処理その他)
Collections.sort(hoges, comparator);


[Android]Wi-Fi機能を使用する時のパーミッション設定

Wi-Fi機能を使用する(状態を参照する/設定を変更する)時には、

android.permission.ACCESS_WIFI_STATE(状態参照)
android.permission.CHANGE_WIFI_STATE(設定変更)

の2つのパーミッション設定を以下の様にAndroidManifest.xmlに追加する必要がある(7行目と8行目)。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="xxxxxxx"
          android:versionName="1.0.0" android:versionCode="1">
    <uses-sdk android:targetSdkVersion="3" android:minSdkVersion="3"/>

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="xxxxxxx.MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


[Java]正規表現を使用した文字列抽出

正規表現にはPatternクラスとMatcherクラスを使用する。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
例えば、ある文字列から丸括弧()で挟まれた文字列を抽出する場合は、以下。
String regex = "\\(.+?\\)";
String target = "(abeshi)and(hidebu)";
List<String> omaewamoshindeiru = new ArrayList<String>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(target);
while (matcher.find()) {
    omaewamoshindeiru.add(matcher.group());
}
正規表現のパターンを表す文字列regexを引数にして、PatternクラスのcompileメソッドでPatternクラスのインスタンスを取得。
続いて文字列抽出の対象となる文字列targetを引数にして、PatternクラスのmatcherメソッドでMatcherクラスのインスタンスを取得。

Matcherクラスのfindメソッドで検索を実施し、正規表現のパターンにマッチする度に、StringのListであるomaewamoshindeiruにそのマッチした文字列を追加していく。

その結果、omaewamoshindeiruには以下文字列が格納される。

(abeshi)
(hidebu)

正規表現のパターンを変えることで、様々な文字列を抽出することができる。


[雑談]安道名津

本ブログのタイトルにかこつけて、南方仁しぇんしぇ~(Copyright (C) 1867 坂本龍馬 All Rights Reserved.)考案の「安道名津」を買ってみました。

安道名津

一般的な「あんドーナツ」は穴がなく、中にあんこが入っていますが、これはちゃんとドーナツ型で、上にあんこがのっています。
生地には黒ごまが練り込まれていて、甘過ぎず、個人的には好みの味でした。

皆さんもお試しあれ。


プロフィール

まさお

Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。

ブログランキング
ブログランキング参加中。是非クリックお願いします。


にほんブログ村 IT技術ブログ Androidアプリ開発へ

人気ブログランキングへ

ブログランキング



ブログ王

ブログランキング【ブログの惑星】

プログラム人気ブログランキング
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。