android - 落ちる - fragment から activity 遷移




ViewGroup派生クラスのライフサイクル管理方法 (2)

私はいくつかの外部データのグラフを表示するアクティビティでたくさんのコードを持っていました。 アクティビティコードが混雑しているので、私はこのコードを抽出してGraphViewクラスを作成することにしGraphView

public class GraphView extends LinearLayout {
    public GraphView(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        inflater.inflate(R.layout.graph_view, this, true);
    }

    public void start() {
        // Perform initialization (bindings, timers, etc) here
    }

    public void stop() {
        // Unbind, destroy timers, yadda yadda
    }
        .
        .
        .
}

この新しいLinearLayout由来するクラスへの移行は簡単でした。 しかし、このグラフで使用されているタイマーやイベントリスナーの作成と破棄に関連したライフサイクル管理コードがありました(たとえば、アクティビティが一時停止した場合、バックグラウンドでこのポーリングを行いません)。

MS Windowsの背景から、オーバーライド可能なonCreate() onDestroy()メソッドやonDestroy()メソッドなどを見つけることが期待されていますが、LinearLayout(またはその継承されたメンバー)のソートについては何も見つかりませんでした。 アクティビティにこの初期化コードをすべて残してからビューに渡す必要があったのは、このコードをすべて再利用可能なビューにカプセル化するという本来の目的を破ったようです。

私はビューに2つの追加パブリックメソッド、 start()stop()追加しました。 これらの呼び出しは、それぞれアクティビティのonPause()メソッドとonPause()メソッドから行います。

これはうまくいくようですが、ここでダクトテープを使用しているような感じです。 誰かがこれが一般的にどのように行われているか知っています 私は何かが欠けているように感じる...


protected void onAttachedToWindow()protected void onDetachedFromWindow()をオーバーライドして使用することができるかもしれませんが、試したことはありませんが、お望みのときに呼び出すことができます。


残念なことに、Viewオブジェクトには、バックグラウンドモードとアクティブモードから移行する際のアクティビティとしてのコールバックメソッドはありません。

とにかく、あなたがそのようなアプローチを主張するならば、私はあなたが得る最も近いものは、initコードをコンストラクタに入れ、destructコードをfinalize()のオーバーライドに入れることだと思います。 finalize()メソッドは、オブジェクトがもはや参照されていないときにシステムによって実行され、ガベージコレクションの準備が整います。 vmが終了すると、まったく呼び出されないことがあります。 そして、私はこの方法をお勧めしません。

また、短い寿命のオブジェクトがメモリリークを引き起こすため、アプリケーションが一時停止から再開に移行したときに、GraphViewオブジェクトを何度も作成して破棄したくない場合。 gcがいつこれらのオブジェクトのメモリを解放するかは決して分かりません。

私はstart()メソッドとstop()メソッドを使ったあなたのapprorachは大丈夫だと思います。単純できれいにしてください。 AsyncTasks(またはTimerオブジェクト)を維持するだけです。

(あなたのビューを膨らませる方法に関するトピックオフ:私はコードのいくつかの行のために私を保存するので、私はView.inflate()を使用します)





android