【问题标题】:How To Declare Constants in Android without using public static final如何在不使用 public static final 的情况下在 Android 中声明常量
【发布时间】:2017-12-19 14:49:36
【问题描述】:

我正在开发一个蓝牙应用程序,它一直在运行,直到用户卸载应用程序或关闭他们的手机。我收到一条错误消息:“不幸的是应用程序停止工作”。从我最初的研究来看,这似乎是一个内存泄漏问题。到目前为止,我发现任何具有静态引用的对象都会泄漏内存。所以我需要删除变量的静态引用。我的项目有很多常量,不使用public static final怎么写常量?

目前,我正在使用这样的东西:
public static final int NOTIFICATION_ID=1234;

更新

我认为我的问题需要更多信息,所以在这里

私有静态变量问题 1)嗨朋友,我的应用程序使用的数据库有 9 个表,每个表有 7 到 13 列,所以我声明的列名就像 私有静态最终字符串 COLUMN_NAME_ACTIVE = "活动"; 同样声明了 70 多个静态变量。 2)在我声明的另一个类中访问的一些实例 3)1 util类它是一个静态类

【问题讨论】:

  • 使用接口而不是在类中定义
  • 静态最终常量不是你的问题。它们占用了一些内存,但它们都是在启动时分配的,之后就再也不会移动了。你可能有一个更复杂的问题。 stackoverflow.com/questions/6470651/…
  • "目前我使用的是 public static final int NOTIFICATION_ID=1234;" -- 这不是内存泄漏。 “当我搜索时,我才知道这是内存泄漏问题”——除非您收到 OutOfMemoryError,否则您不会因内存泄漏而崩溃。

标签: java android memory-leaks bluetooth


【解决方案1】:

您可以在 xml 格式下定义 res/values 中的常量,并使用R. 引用它,在这种情况下为R.integer.

示例:

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

使用示例:

someMethodName(R.integer.notif_id)

【讨论】:

  • R.id 只是一个充满静态最终变量的生成接口。
  • 我的错。我没有意识到。我猜这个线程也可能是“在不使用'static'和'final'这两个词的情况下制作静态最终变量的不同方法”以及此处实际静态最终答案的数量。
  • 现在确实是这样。因为无论如何,static final 是存储这些常量的唯一可行方法。
【解决方案2】:

你可以使用枚举:

public enum Gender {
   MALE,
   FEMALE
}

然后像这样访问它:

Gender.MALE

【讨论】:

【解决方案3】:

通常我在一个文件中声明常量,这将帮助我和其他开发人员更新任何配置/值。

您可以使用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,您将淹没类中的所有常量。即使他们在该课程中也不是必需的。

【讨论】:

  • 你应该提到接口中的“变量”是static final隐式,即使没有这样声明,这是OP想要避免的......跨度>
  • @TimothyTruckle 感谢您指出这一点,更新了我的答案
【解决方案4】:

创建一个接口类并在那里定义变量

public interface Constants{

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

}

并像这样使用它

String name=Constants.Name;

【讨论】:

  • 他可以直接使用接口变量,不需要String name=Constants.Name;
  • 是的,但我只是想解释一下
  • 接口中的变量是静态的 final (stackoverflow.com/questions/2430756/…)
  • 感谢您的信息,我知道这一点,但我需要澄清一下这是否会造成内存问题?
【解决方案5】:

你需要持久化数据,你可以像这样使用SharedPreferences

标记你的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");

【讨论】:

  • 但是他必须初始化它,这意味着他无论如何都需要一堆常量/文字。而且它会使访问常量变得困难,因为它需要一个上下文并且不止一行。
  • 他只需要保存NOTIFICATION_ID的值
  • 他举了一个例子,并不意味着他的整个应用程序中只有一个常量
  • 也许可以,但他没有具体说明他需要什么
  • 即使他只需要一个值,他仍然需要另一个常量来存储密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2013-07-09
相关资源
最近更新 更多