Amalgam
Android で頻出するコードをまとめた Utility ライブラリを使って、コードの整理をする。
リソース管理
Stream I/O なら以下のように。
try-finally ブロックでストリームを閉じるときの null チェックと例外のキャッチをしてくれる。
ContentResolver resolver = context.getContentResolver();
InputStream stream = null;
try {
stream = resolver.openInputStream(Uri.parse("content://something/to/read/1"));
// read stream
} finally {
CloseableUtils.close(stream);
}
Cursor は Closeable であるが、CloseableUtils を使うと具合が悪い(Closeable#close() では例外となる)ため、以下のようにする。
ContentResolver resolver = context.getContentResolver();
Cursor c = null;
try {
c = resolver.query(uri, null, null, null, null);
} finally {
CursorUtils.close(c);
}
Parcel
boolean に関するシリアライズとデシリアライズのメソッドが Parcel にないので、以下のようにする。
public class MyParcelable implements Parcelable {
private boolean mHoge;
public MyParcelable(Parcel source) {
mHoge = ParcelUtils.readBoolean(source);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelUtils.writeBoolean(dest, mHoge);
}
}
Thread
メソッドの呼び出しがどのスレッドで実行されているかをチェックする。
ブロックするメソッドはメインスレッドで呼ばれてほしくないので、もしメインスレッドで呼んでいたら例外を投げたいし、UI を操作するメソッドはメインスレッドで呼ばれてほしいので、それ以外のスレッドで呼んでいたら例外を投げたい、という時に使う。
public <T> T blockingGet(String url, Map<String, String> params) {
ThreadUtils.checkNotMainThread();
// ...
}
DialogFragment
LoaderCallbacks のメソッド内での FragmentTransaction は許可されていないので、Handler 経由で表示や非表示の切り替えをする。
DialogFragmentUtils.dismissOnLoaderCallback(fragmentManager, "MY_DIALOG_TAG");