- 公開日:2017年05月27日
記事概要
Google I/O 2017でandroid-architecture-componentsが発表されました。
なかなか良さそうなライブラリだったので、導入して動かしてみました。
この記事は、android-architecture-componentsを触って感じたことを記載した記事です。
環境
- buildToolsVersion 25.0.3
- android.arch.lifecycle 1.0.0-alpha1
lifecycleとは
ActivityやFragmentのライフサイクルに合わせてデータを管理できるライブラリです。
ドキュメントを読んでgoogle code labのサンプルを実装した感じでは、以下のような感想を持ちました。
良い点
- オブジェクトをActivityやFragmentのライフサイクルに関連づけられるのが良い。onDestory()等の処理が楽になりそう。アプリの停止や生存チェックが減りそう。
- SNSや通知アプリなどのpub, subを利用するアプリが作りやすくなりそう。RxJavaのFlowableを使うとよりよくなりそう。
- 縦画面と横画面の作り分けが楽になる。これが一番大きい。
- Roomは、ibatisに似ている。経験者はすぐに使いこなせるのではないだろうか。RxJavaと連携もできる。
悪い点
- Observerクラス増えすぎ。どのライブラリもObserverとSubscribeで溢れている。可読性がさらにひどくなる。。
- 開発者に要求されるハードルがまた上がる。
触った印象では、難しくはないので、考え方に慣れることが大事なのかなと思いました。
実装
1.0.0-alpha1のLifecycleActivityはFragmentActivityを継承しているクラスなので、AppCompatActivityクラスを継承したActivityクラスでは利用できません。かといってLifecycleActivityをそのまま利用するのは機能不足すぎで話になりません。しかも、This class is a temporary implementation detail until Lifecycles are integrated with support library.とあるように、LifecycleActivityは一時的な実装なので利用する意味がありません。
なので、以下のように改造します。
変更前
public class MainActivity extends AppCompatActivity implements HomeFragment.OnFragmentInteractionListener, {
public static final String TAB_HOME = "TAB_HOME";
public static final String TAB_COLLECTION = "TAB_COLLECTION";
public static final String TAB_NOTICE = "TAB_NOTICE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// something...
}
変更後
public class MainActivity extends AppCompatActivity implements LifecycleRegistryOwner, HomeFragment.OnFragmentInteractionListener, {
private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);
@Override
public LifecycleRegistry getLifecycle() {
return mRegistry;
}
public static final String TAB_HOME = "TAB_HOME";
public static final String TAB_COLLECTION = "TAB_COLLECTION";
public static final String TAB_NOTICE = "TAB_NOTICE";
public static final String TAB_HOME = "TAB_HOME";
public static final String TAB_COLLECTION = "TAB_COLLECTION";
public static final String TAB_NOTICE = "TAB_NOTICE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// something...
}
LifecycleRegistryOwnerをimplementsしてLifecycleRegistryのインスタンスをもたせます。これで、AppCompatActivityでも利用可能になります。
あとはViewModelProvidersを使えば、ViewModelのオブジェクトを管理できます。
Activityに付加したFragmentでViewModelを管理する場合は、以下のように実装します。
public class HomeFragment extends Fragment {
public static final String TAG = "HomeFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
homeModel = ViewModelProviders.of(getActivity()).get(HomeModel.class);
}
// something...
}
これにより、画面の回転などでonCreate()の再呼び出しをしてもViewModelを継承したモデルから値を取得することが可能になります。
結論
android-architecture-componentsはsupport libraryと同様、デファクトのライブラリになりそうな気がします。
この他にも、通知やDBでも活躍できそうなので、色々と試していきたいですね。


0 件のコメント:
コメントを投稿