ライフサイクルのAndroidのジェットパックアーキテクチャコンポーネント(6)

アリP7モバイルインターネットの建築家、無料の学習のための高度なビデオ(毎日更新)、クリックしてください:https://space.bilibili.com/474380680

ライフサイクルを意識した部品加工のライフサイクル

(そのような活性フラグメントなど)場合、他のコンポーネントのライフサイクル状態変化対応コンポーネントのライフサイクルのアクションをとることができます。これらのコンポーネントは、私たちは、コードを維持するために、より軽量で、より簡単に生成することができます。

我々は通常のライフサイクル・アプローチの活性およびフラグメントでのビジネスロジックを実現します。しかし、このアプローチは悪いとエラーコードの組織の増加につながります。しかし、ライフサイクルを意識した部品を使用して、我々はコンポーネントがライフサイクル・アプローチのうちのライフサイクルに依存するコードすることができます。

これらのコンポーネントは自動的に活動およびフラグメントのライフサイクルの現在の状態に応じてその動作を調整することができます - Android.arch.lifecycleパッケージには、私たちが認識してコンポーネントのライフサイクル構築することができ、クラスとインタフェースを提供します。

ほとんどのAndroid Frameworkアプリケーションコンポーネントは、追加のライフサイクルの中で定義されています。オペレーティングシステムによって、またはフレームワークコード管理のプロセスで実行ライフサイクル。彼らは、私たちのアプリケーションは、それらに従わなければならない、そうする失敗はメモリでも、アプリケーションのクラッシュを引き起こす可能性が漏れる、コアAndroidの動作原理です。

私たちは今、携帯電話の画面に表示するための活動、デバイスの場所を持っていると仮定します。次のように一般的な実装は次のようになります。

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}


class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, (location) -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // manage other components that need to respond
        // to the activity lifecycle
    }
}

この例では、良いように見えますが、実際の応用では、最終的には、ライフサイクルの現在の状態に応じて、UIや他のコンポーネントを管理するために多くのコールバックになります。が、複数の構成要素は、例えばリードONSTART(として、メソッド内のコードの大量のライフサイクルに置かれる管理)およびonStop()このメソッドは、維持することは困難です。

加えて、我々は長時間実行操作を実行する必要がある場合、我々は、MyActivity停止、開始前にMyLocationListenerを保証することはできません(例えば、いくつかの設定チェックONSTARTを()で)、この操作の完了コールバックする前()のonStop MyActivityにつながることができました、部品が必要な長い時間がかかる彼らの活動を維持することができました。

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, location -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            // what if this callback is invoked AFTER activity is stopped?
            if (result) {
                myLocationListener.start();
            }
        });
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}

android.arch.lifecycleパッケージには、これらの問題を解決するための分離株と弾力の方法に私たちを助けることができるクラスとインタフェースを提供します。

ライフサイクル

ライフサイクルは、成分(例えば、断片もしくは活性)及びライフサイクル状態情報に保持されているが、このクラスの観察状態の他のオブジェクトを可能にします。

ライフサイクルその関連コンポーネントのライフサイクル状態を追跡するための2つの主な列挙:

イベント

ライフサイクルFrameworkクラスからの配布やライフサイクルイベント。これらのイベントは断片でコールバックやイベント活動にマッピングされます。

状態

ライフサイクルによって、オブジェクト・コンポーネントの現在の状態を追跡するために。

 

 
19956127-8135ce224007f36a.png
 

 

状態は、グラフのノード、ノード間のエッジと見なすイベントとみなします。

クラスは、アセンブリのメソッドにアノテーションを追加することによって、そのライフサイクルの状態を監視することができます。我々はaddObserver()メソッドライフサイクルクラス、インスタンスを呼び出すことによって、視聴者を追加し、次の例に示すように、視聴者を通過することができます。

public class MyObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
        ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
        ...
    }
}

myLifecycleOwner.getLifecycle().addObserver(new MyObserver());

上記の例では、myLifecycleOwner LifecycleOwnerオブジェクトは、これは次のセクションで説明する、インタフェースを実装します。

LifecycleOwner

LifecycleOwnerは、それがライフサイクルLifecycleOwnerクラスインターフェースを実装したことを示す、のみgetLifecycle()メソッドであり、インタフェースです。あなたがアプリケーション・プロセスのライフサイクル全体を管理しようとしている場合は、ProcessLifecycleOwnerを見ることができます。

個々のクラス(例えば、断片およびAppCompatActivity)からインタフェースLifecycleOwnerライフサイクル、所有権を抽象化、およびアセンブリの使用それのために準備を可能にします。任意のカスタムクラスはLifecycleOwnerインターフェイスを実装することができます。

所有者は、ライフサイクルを提供することができるので、実現LifecycleObserver部品と実装部品LifecycleOwnerはシームレスな作業、視聴者は、登録を観察することができます。

例えばトラッキング位置の例として、我々はLifecycleObserver MyLocationListenerクラスが実装を行うことができ、そして()メソッドはそれを論理的論理状態の変化に応じて、ライフサイクルは、MyLocationListenerアクティビティ宣言することができないことを意味するのonCreate活動のライフサイクルを初期化しますコードの後、それぞれのアセンブリに配置され、そして活動より管理のフラグメントを作ることができます。

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {
            // update UI
        });
        Util.checkUserStatus(result -> {
            if (result) {
                myLocationListener.enable();
            }
        });
  }
}

一般的な使用例は、ライフサイクルが現在アクティブでない場合、あなたには、いくつかのコールバックを呼び出すことは避けるべきです。たとえば、次のようにコールバックがonSaveInstanceStateに、アクティビティの状態で保存されている場合、我々は、コールバックを呼び出さないようになるので、()フラグメントトランザクションを実行し、それは、クラッシュの引き金となるでしょう。

このユースケースを簡略化するために、ライフサイクルのクラスは他のオブジェクトが現在の状態を照会することができます。

class MyLocationListener implements LifecycleObserver {
    private boolean enabled = false;
    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
       ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        if (enabled) {
           // connect
        }
    }

    public void enable() {
        enabled = true;
        if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
            // connect if not connected
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
        // disconnect if connected
    }
}

この実現により、我々はLocationListenerクラスのライフサイクルを把握することができます。私たちは別のアクティビティまたはフラグメントからLocationListenerを使用する必要がある場合、我々はそれを初期化する必要があります。LocationListener管理クラス自体によってすべての設定およびアンロード操作。

あなたはライフサイクルクラスのAndroidを提供するライブラリを使用する必要がある場合、Googleは我々はライフサイクルを意識したコンポーネントを使用することを示唆しました。当社のクライアントは、簡単に手動でクライアントのライフサイクルを管理する必要なしに、これらのコンポーネントを統合することができます。

カスタムLifecycleOwnerの実装

サポートライブラリ26.1.0以降のフラグメントと活動にLifecycleOwnerインターフェースを実現しています。

カスタムクラスがLifecycleOwnerになりたい場合は、LifecycleRegistryクラスを使用することができますが、次のコードのようにライフサイクルイベントに転送する必要があります。

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

認知のベストプラクティスコンポーネントのライフサイクル

流線型のように私たちのUIコントロール(活動およびフラグメント)。彼らはViewModelにを使用してこれを行う必要があり、逆に、自分のデータを取得しよう、と見解を反映するために変更にLiveDataデータ対象を観察するべきではありません。

書き込みデータ駆動型UI、UIビューコントローラは、データの変更を更新する責任がある、またはユーザに通知することがViewModelにを運営しています。

ViewModelクラスの当社データの論理。ビューモデルコントローラとアプリケーションUIの残りの部分との間のブリッジとしてべきです。しかし、ViewModelには業務(ネットワークからなど)のデータを取得していません。その代わりに、ビューモデルは、その結果をUI制御部に設けられ、データを取得するために適切なコンポーネント(例えば、コンポーネントリポジトリ)を呼び出すべきです。

データは、コントローラとUIビューとの間のクリーンな界面を維持するために使用される結合します。これが私たちの見解は、より宣言になります、とアクティビティやフラグメントで更新を書くために必要なコードを最小限に抑えます。あなたがこれを行うには、Javaプログラミング言語を使用することを好む場合は、コードより良い抽象化を行い、回避の定型コードをライブラリーのようなバターナイフを使用しています。

あなたのUIが複雑な場合、UIの変更を処理するために、プレゼンターのクラスを作成することを検討。これは、退屈な作業することができますが、それは簡単にテストへのUIコンポーネントに私たちをことができます。

であなたのViewModelにコンテキストビューまたはアクティビティを参照することは避けてください。(例えば、構成変更の場合のように)この活性よりビューモデルの生存期間場合、ガベージコレクタにつながるが正しくメモリリーク原因アクティビティを処理しません。

ライフサイクルは、アセンブリの使用を認知しました

意識のコンポーネントのライフサイクル、私たちはより簡単にさまざまな状況でライフサイクルを管理することができます。たとえば、次のシナリオ:

粗粒ときめ細かい位置更新を切り替えます。粗粒アプリケーション更新の背景とスイッチ内のアプリケーションにおける我々の位置が表示されているきめ細かい位置更新を可能にするためのライフサイクル対応コンポーネント。LiveDataは、ユーザーが場所を変更したときに私たちのアプリケーションは自動的にUIを更新することを可能にする、ライフサイクル対応のコンポーネントです。

停止は、ビデオバッファを開始します。ライフサイクルを意識したコンポーネントは、できるだけ早くとしてビデオバッファを開くことができますが、アプリケーションが完全に起動するまでプレーを延期します。また、破壊されたアプリケーションをバッファリング終了時のライフサイクルを意識したコンポーネントを使用することができます。

スタートとストップのネットワーク接続。アプリケーションがフォアグラウンドであり、かつ自動的にアプリケーションがバックグラウンドに移行したときに一時停止したときにデータ・ネットワーク(ストリーミング)のリアルタイム更新を有効にするには、ライフサイクル対応のコンポーネント。

一時停止やアニメーターを再開します。ときライフサイクルのポーズを使用してバックグラウンドでアプリケーションは、フォアグラウンドで内容を描かれたアニメーションコンテンツ対応のコンポーネント、およびアプリケーションのリカバリを描かれました。

イベント処理ON_STOP

あなたがAppCompatActivityライフサイクルまたはフラグメントに属している場合はonSaveInstanceStateのAppCompatActivityまたはフラグメント()メソッドが呼び出されたとき、状態はライフサイクルが作成なり、そのON_STOPイベントが配布されます。

ON_START前1または断片AppCompatActivityの状態がonSaveInstanceState()に保存されている場合、それが呼ばれるUIは不変と考えられています。状態を保存した後、UIを変更する理由の試みは、アプリケーションが状態を保存した後FragmentTransactionを実行している場合、FragmentManagerは例外がスローされます理由ですアプリケーションの一貫性のないナビゲーション状態、につながる可能性が、詳細な理由は、commit()を参照してください。

協会がライフサイクル状態観測を開始されていない場合、箱から出して、この状況にビューアを防ぐために、その辺を呼び出すことによって回避することLiveData。背後にある、それは)(その視聴者を呼び出す前に、呼び出しがisAtLeastことを保証します。

卵の痛みは、プログラムが状態を残すために引き起こすが、UIのライフサイクルを変更することはできないといない区間CREATED状態にされたコール、後onStopのAppCompatActivity()メソッド意志onSaveInstanceState()です。

(システムの)呼び出しonStopは、予定外のイベントの前にしても、この問題は、ライフサイクルクラスのベータ2版およびスケジューリングイベントとしてマークされた下位バージョンCREATED状態を防ぐために、実際の値を取得する任意のコードの現在の状況を確認してください。

このソリューションは、2つの大きな問題があることを悲しいリマインダー:

そして、低レベルのAPI 23、Androidのシステムは、実際にそれが部分的に別のアクティビティで覆われているにもかかわらず、活動の状態を保存しました。言い換えれば、Androidのシステムは、(onSaveInstanceStateを呼び出します)が、onStop()を呼び出す必要はありません。 - ライフサイクルがアクティブになって考える - これは、それはまだ、オブザーバーをUIの状態を変更することができない場合でも、潜在的に長い間隔を作成します。

あなたはLiveDataクラスに似た振る舞いを公開する任意のクラスは、ベータ2バージョンおよびそれ以前のオファーライフサイクルソリューションを実装する必要があります。

ご注意ください

onSaveInstanceState()を呼び出すときにコールウェイティングonStop()メソッドずに、作成され、スケジューリングON_STOPとして、このプロセスを簡単にするために、および1.0.0-RC1版から始め、旧バージョンとのより良い互換性を提供するために、ライフサイクルのオブジェクトがマークされています。これは、我々のコードに影響を与えないかもしれないが、それは呼び出しAPI 26の順と下位レベルのActivityクラスと一致していないので、我々はこれに注意を払う必要があります。

オリジナルリンク:https://blog.csdn.net/guiying712/article/details/81176039
アリP7モバイルインターネットの建築家、無料の学習のための高度なビデオ(毎日更新)、クリックしてください:https://space.bilibili.com/ 474 380 680

おすすめ

転載: www.cnblogs.com/Android-Alvin/p/12109549.html