2017-07-14 18 views
0

私は、ユーザーがアプリケーションをアンインストールするか、携帯端末をオフにするまで、常に実行されているBluetoothアプリを開発しています。エラーメッセージが表示されます。「残念ながら、アプリは動作を停止しました。私の最初の研究から、これはメモリリークの問題のようです。これまでは、静的参照を持つオブジェクトがメモリをリークすることが分かっています。だから私は変数の静的な参照を削除する必要があります。私のプロジェクトには多くの定数がありますが、public static finalを使用せずにどのように定数を書くことができますか?パブリックstatic finalを使用せずにAndroidで定数を宣言する方法

現在、私はこのようなものを使用しています:
public static final int NOTIFICATION_ID=1234;

更新

私は私の質問はので、ここでいくつかのより多くの情報を必要だと思い、それである

プライベート静的変数問題 1)こんにちはフレンズ、私のアプリはデータベースを使用して各テーブルは7~13の列を持っているので、私は のように宣言している列の名前は、静的な最終的な文字列COLUMN_N AME_ACTIVE = "アクティブ"; 同様に70以上の静的変数が宣言されています。 2)事例のいくつかは、私が 3)1 utilのクラスを宣言した別のクラスにアクセスするためには、インターフェースクラスを作成し、そこに

public interface Constants{ 

String Name="AAA"; 
String Age="20"; 

} 

を変数を定義し、このようにそれを使用する静的クラス

+0

クラスを定義する代わりに、インターフェイスを使用してください。 – akhilesh0707

+5

静的最終定数はここで問題にはなりません。彼らはいくらかの記憶を取りますが、起動時にすべて割り当てられ、その後は決して移動しません。もっと複雑な問題があるかもしれません。 https://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java – litelite

+3

"現在、私は静的final finalと同じように使用しています。NOTIFICATION_ID = 1234;"それはメモリリークではありません。 "私が検索したときに、これがメモリリークの問題であることがわかった" - あなたは 'OutOfMemoryError'を得ていない限り、メモリリークからクラッシュしません。 – CommonsWare

答えて

0

です

あなたはこのような SharedPreferencesを使用することができ、データを永続化する必要が
String name=Constants.Name; 
+0

彼は直接インターフェイス変数を使用する必要はありませんString name = Constants.Name; – akhilesh0707

+0

はい、私はただ説明しようとしていました – AbhayBohra

+2

インターフェイス内の変数はstatic finalです(https://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – litelite

0

あなたDecalre:

SharedPreferences sharedpreferences = getSharedPreferences("mypref", Context.MODE_PRIVATE); 

あなたのSharedPreferencesへの書き込み:

Editor editor = sharedpreferences.edit(); 
editor.putString("key", "value"); 
editor.commit(); 

としたいとき、それから読み取る:

String value = sharedpreferences.getString("key","defaultValue"); 
+0

しかし、彼はそれを初期化しなければならないでしょう、とにかく、とにかくどこかの定数/ litteralが必要になるでしょう。そして、それはコンテキストと1つ以上の行を必要とするため、定数へのアクセスを困難にします。 – litelite

+0

彼は 'NOTIFICATION_ID'の値を保存するだけでよいです –

+0

彼は1つの例を挙げましたが、彼のアプリケーション全体で単一の定数を持っているわけではありません – litelite

0

通常、私は私を助ける1つのファイルに定数を宣言し、他の開発者は設定/値を更新します。

interfaceを使用すると同じ結果が得られます。インターフェイスは、デフォルトではstatic finalであり、staticとfinalの両方として宣言されている変数宣言です。

public interface MyConstants { 
    String SERVER_URL = "my_server_address"; 
    int SPLASH_LAUNCH_TIME = 1000; 
} 

あなたは2つの方法でインターフェース内の定数を使用することができます -

。 MyConstants.SERVER_URLのように直接呼び出します。

b。あなたのクラスにinterfaceを実装し、すべての定数に直接アクセスしてください。

アプローチを賢明に選択すると、アプローチ2を使用すると、クラス内のすべての定数がフラッディングされます。そのクラスでさえ必要ではありません。

+0

インターフェイスの "変数"は、静的final' *暗黙のうちに*宣言されていなくても、OPが避けたがっていることに言及する必要があります... –

+0

@TimothyTruckleは指してくれてありがとう、私の答えを更新しました – Rahul

1

xml形式のres/valuesで定数を定義し、R.を使用してこのケースを参照できます。この場合はR.integer.です。

例:

<resources> 
    <integer name="notif_id">1234</integer> 
</resources> 

使用例:あなたが列挙型を使用することができます

someMethodName(R.integer.notif_id)

+1

'R.id'は静的最終変数でいっぱいになった生成されたインタフェースです。 – litelite

+0

私の悪い。私は気付かなかった。私はこのスレッドは、実際に静的な最終的な答えの数とともにここにある単語 'static'と 'final'を使わずに静的最終変数を作る異なる方法かもしれないと思います。 – Tomatocurry1

+0

それは今のところ真実です。いずれにしても、これらの定数を格納するには、スタティックファイナルのみが実行可能な方法であるためです。 – litelite

0

public enum Gender { 
    MALE, 
    FEMALE 
} 

とアクセス

Gender.MALE 
+0

それは、Javaでは、列挙型の静的な内部の束を持つクラスを生成するように見える。 https://stackoverflow.com/questions/143285/how-much-memory-do-enums-take – litelite

+0

この1は良いですがenumはapkのサイズに影響します –

関連する問題