2017年5月27日土曜日

【Android7.1】Architecture componentsの調査。AppCompatActivityでLifecycleを利用する

  • 公開日: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は一時的な実装なので利用する意味がありません。
なので、以下のように改造します。

変更前
{project_folder}/MainActivity.java

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...
}

変更後
{project_folder}/MainActivity.java
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を管理する場合は、以下のように実装します。

{project_folder}/HomeFragment.java
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でも活躍できそうなので、色々と試していきたいですね。

PICK UP

運営サイト


この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...