2017-07-14 31 views
0

我正在開發一個始終運行的藍牙應用程序,直到用戶卸載應用程序或關閉其移動設備。我收到一條錯誤消息:「不幸的應用程序停止工作」。從我最初的研究來看,這似乎是一個內存泄漏問題。到目前爲止,我發現任何具有靜態引用的對象都會泄漏內存。所以我需要刪除變量的靜態引用。我的項目有很多常量,我如何在不使用public static final的情況下編寫常量?如何在不使用公共靜態的情況下在Android中聲明常量最終

目前,我使用的是這樣的:
public static final int NOTIFICATION_ID=1234;

更新

我覺得我的問題需要更多的信息,以便在這裏它是

私有靜態變量的問題 1)嗨朋友,我的應用程序使用數據庫有9個表,每個表有7到13列,所以列名我聲明像 私人靜態最終字符串COLUMN_N AME_ACTIVE =「active」; 類似地,已經聲明瞭超過70個靜態變量。 2)某些情況下,在另一個類我宣佈 3)1 UTIL類來訪問它是一個靜態類

+0

使用接口,而不是在類中定義 – akhilesh0707

+5

靜態最終常量在這裏不是你的問題。他們佔用了一些內存,但是這些內存都是在啓動時分配的,並且從不隨後移動。你可能有一個更復雜的問題。 https://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java – litelite

+3

「目前我使用像公共靜態最終詮釋NOTIFICATION_ID = 1234;」 - 這不是內存泄漏。 「當我搜索時,我知道這是內存泄漏問題」 - 除非得到'OutOfMemoryError',否則不會因內存泄漏而崩潰。 – CommonsWare

回答

0

創建一個接口類,並定義變量有

public interface Constants{ 

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

} 

而且使用這樣的

String name=Constants.Name; 
+0

他可以直接使用接口變量,不需要String name = Constants.Name; – akhilesh0707

+0

是的,但我只是試圖解釋 – AbhayBohra

+2

變量在接口是靜態的最終(https://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – litelite

0

需要持久化數據,你可以使用SharedPreferences這樣的:

Decalre您SharedPreferences

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反正地方。而且它會使訪問常量變得困難,因爲它需要一個上下文並且不止一行。 – litelite

+0

他只需要保存「NOTIFICATION_ID」的值 –

+0

他給出了一個例子,並不意味着他的整個應用程序中只有一個常量 – litelite

0

通常我在一個文件中聲明的常數,這將有助於我和其他開發人員更新任何配置/值。

您可以通過使用interface來實現相同。默認情況下,接口是靜態最終的,聲明爲靜態和最終的變量聲明。

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

您可以通過2種方式使用接口常量 -

一個。直接調用它們,比如MyConstants.SERVER_URL;

b。在你的類中實現interface並直接訪問所有常量。

明智地選擇你的方法,通過使用方法2你將洪泛所有常量在你的班級。即使他們不是那個班級所必需的。

+0

你應該提到,接口中的「變量」是隱含的,即使沒有被聲明,這是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

我的不好。我沒有意識到。我想這個線程可能是「不同的方式來製作靜態最終變量,而不使用'靜態'和'最終'兩個字,這裏的靜態最終答案的數量。 – Tomatocurry1

+0

這就是現在的確。因爲,無論如何,static final是存儲這些常量的唯一可行的方法。 – 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是好的,但枚舉會影響APK大小 –

相關問題