- 公開日: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 件のコメント:
コメントを投稿