2016-05-10 6 views
1

私のアプリができるだけ効率的に動作することを確認したいと思い、アクティビティのライフサイクルを調べています。特に、アクティビティonCreateにボタンsetOnClickListenersを作成します。Androidボタンリスナーのライフサイクル

私の理解から、アンドロイドはまたはonStopの後にリソースをクリアすることができます。これは、リスナーがまだ存在するかどうかを確認し、必要に応じてonResumeに再作成する必要があることを意味しますか?

+0

なぜあなたはアンドロイド(gc)がリスナーをきれいにすると思いますか? 'onDestroy'アクティビティにはまだボタン上のリンクがあり、リスナ上のリンクがあります。 –

答えて

2

あなたが設定したListenersは、自分自身がViewsである限り、リソースにはランタイムに重要なオブジェクトではなく、リソースをクリーンアップできます。しかし、Listenersの中で参照しているものは、呼び出されたときにそこに存在しないかもしれませんので、あなたがアクセスしているオブジェクトがヌルでないかどうかを確認してください:-)

もっと洞察が必要な場合は、 Javaのgcのメカニズムは動作します:Viewsの内部はActivityですので、Activityがある限り安全です。何らかの理由であなたがcloseDatabase()メソッドと呼ばれることを想像し、今

/** This is hand code, it won't compile most probably ^^ **/ 
public class myActivity extends Activity { 
    private DataBase db; 
    private Button button; 

    public void onCreate(){ 
     db = /* init db somehow */ 
     button = (Button) findViewById(R.id.button); 
     button.setOnclickListener(new OnClickListener() { 
      public void onClick(View view) { 
       db.doSomething(); 
      } 
     }); 
    } 

    public void closeDatabase() { 
     db = null; 
    }  
} 

と:それは再作成されたときや、onCreateはあなたが簡単な例を持っている。ここ

:-)再び呼び出されます。その後、ユーザーがボタンをクリックすると、アプリはNullPointerExceptionでクラッシュします。

これは当然ながら直接的な例です(つまり、コード内でdbオブジェクトをnullにしています)が、システム内で自動的に発生する可能性があります。

+0

これは、画像Uriなどのグローバル変数を使用して何らかの理由でアプリケーションを中断した場合、実際にはnullになることを意味します。 – Dimebag

+1

多かれ少なかれ、グローバル変数ではなくローカルフィールドを意味しています(一定の値を定義しない限り、Androidではグローバル変数は使用しないでください)。私は答えに例を追加します:-) – Kelevandos

+0

私のアプリは複数のアクティビティを通して1つの画像を処理することに依存しているので興味深いです。私はそのウリを複数の方法で必要としていたので、他の活動を処理する意図を持っている。 – Dimebag

関連する問題