ホームページ  >  記事  >  Java  >  Android のグローバル変数とローカル変数

Android のグローバル変数とローカル変数

伊谢尔伦
伊谢尔伦オリジナル
2017-01-23 13:16:171408ブラウズ

グローバル変数は、名前が示すように、クラス全体または複数の関数で呼び出すことができる変数です。外部変数とも呼ばれます。ローカル変数は、特定のプロシージャまたは関数内でアクセスできる変数です。変数を宣言するのは非常に簡単ですが、実際に使用するとなると、想像するほど簡単ではありません。私の場合、グローバル変数を定義して使用することが多いのですが、これのためだけにグローバル変数を定義します。また、多くの紆余曲折を免れました。

Android のグローバル変数とローカル変数

アダプターを使用する場合、通常、アダプターは常に listView とともに使用されます。これは、listView には基本的に listView の項目のレイアウトがあるためです。次のシナリオは次のとおりです。各項目に ImageView があり、項目をクリックすると、項目の ImageView の背景色を変更するか、別の背景画像に変更する必要があります。このとき、最初の項目をクリックすると 3 番目の項目または 2 番目の画像が表示されることがあります。記事も変わってます。これは、グローバル変数を定義しているためです。コード部分は次のとおりです:

public class  Adapter extends BaseAdapter {
private ImageView img;

  public View getView(int position, View convertView, ViewGroup parent) {
  convertView = mInflater.inflate(R.layout.group_listview_item,null);
  img = (ImageView) convertView.findViewById(R.id.logo);

  return convertView;

  }
}

上記の部分では、ImageView はグローバル変数です。このとき、ImageViewをローカル変数として定義する必要があります

 public class  Adapter extends BaseAdapter {
 public View getView(int position, View convertView, ViewGroup parent) {
     convertView = mInflater.inflate(R.layout.group_listview_item,null);
     ImageView  img = (ImageView) convertView.findViewById(R.id.logo);
    return convertView;
  } 
}

このとき、各ItemのImageViewを表します。別の状況では、ショッピング カートを作成するときに、プラスまたはマイナスのアイコンをクリックしてショッピング カート内の商品数を変更できます。数量 num を定義するときは、ローカル変数としても定義する必要があります。 ViewHolderが使えるともっと良いです。

static によって変更された静的変数は、さまざまなクラスやパッケージで使用でき、仮想マシン内で別のメモリを占有することができ、非常に便利です。しかし、プロジェクトの開始後に静的変数を発見しました。あまり良くないこともあります。プロジェクトの崩壊情報を見ると、Mo Ming が空ポインタで異常なエラーを起こしている箇所が多かったことが分かりました。調査の結果、静的の問題である可能性があることが判明しました。プロジェクトでは、ユーザーの情報、つまり User オブジェクトを静的変数に保存しており、エラーが報告された箇所ではこの変数が使用されていることがわかりました。この連絡先の保存方法との関係。同時に、多くのユーザーが、電話に応答した後、または長時間待機した後、アプリケーションを開いたときに、アプリケーションに戻ったときにアプリケーションがクラッシュすることを報告しています。これらのクラッシュは、静的変数の null ポインタに関連しています。 。このように、Androidの開発における静的修正とはStaticでしょうか? static User u = new User(); と定義されている場合はあまり問題ないと言えるかもしれませんが、static User u; と定義されている場合は NULL が発生する可能性が高くなります。もちろん、前のメソッドのプロパティも空である可能性がありますが、null ポインターを避けるためにこれをカプセル化できます。さらに、静的定数は依然として非常に便利です。

では、ログイン情報やグローバル情報はどのように保存すればよいのでしょうか? Google の公式推奨事項と Baidu の専門家の推奨事項に従って、Application から継承したカスタム クラスを使用し、継承したクラス内でグローバルに使用する必要がある変数を定義し、getApplicationContext() を通じて関連する変数を取得して保存するようにする必要があります。ただの変数。

 /** 
     * 自定义的MyApplication继承Application 
     *  
     * @author way 
     *  
     */  
    public class MyApplication extends Application {  
        /** 
         * 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的 null 
         * pointer异常。 
         */  
      
        /** 
         * 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或 
         * Service所占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常 
         */  
      
        /** 
         * 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常 
         */  
        private int number;  
      
        @Override  
        public void onCreate() {  
            // TODO Auto-generated method stub  
            super.onCreate();  
        }  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number) {  
            this.number = number;  
        }  
    }

ただし、MyApplication を android.app.Application に置き換えてコード内で有効にするには、AndroidManifest.xml を変更する必要があります:

   <application android:name=".MyApplication" ...>      
   </application>

そうすれば、アクティビティまたはサービスで柔軟に使用できます:

MyApplication application = (MyApplication) this.getApplicationContext();   
    //保存变量  
    application.setNumber(5);  
    //取出变量  
    application.getNumber();

Applicationつまり、アプリケーションは存在しており、GC によって不可解にリサイクルされることはありません。したがって、このメソッドを使用する方が安全です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。