Edited at

Amalgam でコードを整理する

More than 5 years have passed since last update.


Amalgam

https://github.com/nohana/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");