相关疑难解决方法(0)

单身双重锁定锁定

这是我的单例模式的自定义类.在这段代码中,我使用双重检查锁定如下.当我在某些源上阅读很多帖子时,他们说双重检查很有用,因为它可以防止两个并发线程同时运行产生两个不同的对象.

public class DoubleCheckLocking {

    public static class SearchBox {
        private static volatile SearchBox searchBox;

        // private constructor
        private SearchBox() {}

        // static method to get instance
        public static SearchBox getInstance() {
            if (searchBox == null) { // first time lock
                synchronized (SearchBox.class) {
                    if (searchBox == null) {  // second time lock
                        searchBox = new SearchBox();
                    }
                }
            }
            return searchBox;
        }
}
Run Code Online (Sandbox Code Playgroud)

我仍然不太了解上面的代码.如果两个线程在实例为空时一起运行相同的代码行,会出现什么问题?

if (searchBox == null) {
                synchronized (SearchBox.class) {
                    if (searchBox == null) {
                        searchBox = …
Run Code Online (Sandbox Code Playgroud)

java singleton multithreading design-patterns

61
推荐指数
4
解决办法
5万
查看次数

单身人士与科特林的争论

科特林参考说,我可以通过创建一个单例对象关键字,像这样:

object DataProviderManager {
  fun registerDataProvider(provider: DataProvider) {
    //
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想将一个参数传递给该对象.例如,Android项目中的ApplicationContext.

有没有办法做到这一点?

kotlin

26
推荐指数
3
解决办法
7560
查看次数

Android:静态字段和内存泄漏

我一直在研究在创建视图时防止上下文/活动内存泄漏的最佳实践,而且我似乎无法找到关于类中静态字段允许或不允许的内容的明确答案.

假设我有这种形式的代码:

public class MyOuterClass extends Activity{
   private MyInnerClass;
   MyInnerClass = (MyInnerClass) findViewById(<XML call here>);
   MyInnerClass.myXInt = 3;

   // onCreate(), onResume(), etc.

   public static class MyInnerClass extends SurfaceView implements Runnable{
      // Safe variables?
      private static int myXInt, myYInt;
      private static boolean myBoolean;
      // Potentially safe?
      private static Canvas myCanvas;
      // Definitely bad.
      private static Context myContext;

      public MyInnerClass(Context context){
         myContext = context;        // This is bad.
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

关于JVM实际上认为MyInnerClass的ClassLoader是什么,我有点困惑.从技术上讲,由于它是一个SurfaceView对象,一旦应用程序实例化MyInnerClass一次(在View首次膨胀时发生),静态变量似乎应该总是存在,然后保持在那里直到应用程序本身终止.如果是这种情况,是什么阻止Bitmaps和Canvas对象保持打开并填满堆?

我曾经反复重复的唯一一句话就是你不能像我在构造函数中看到的那样泄漏静态上下文,但它永远不会超越它.这真的是你唯一不能做的事情吗?

memory android memory-leaks android-context android-activity

25
推荐指数
1
解决办法
2万
查看次数

Kotlin的单身人士课程

我想知道创建单例类的方法,以便我的Util类每个应用程序只实例化一次.但是当我将我的Java类转换为kotlin时,会生成以下代码.

它是否正确?

companion object {
    private var utilProject: UtilProject? = null

    val instance: UtilProject
        get() {
            if (utilProject == null) utilProject = UtilProject()
            return utilProject!!
        }
} 
Run Code Online (Sandbox Code Playgroud)

我可以找到一个相关的问题,但它是带参数的,我没有在没有参数的情况下进行转换.

android kotlin

23
推荐指数
4
解决办法
3万
查看次数

Android Room - 避免将 Context 传递给 Singleton

我正在尝试将项目迁移到 Android Room。阅读 Android Room 文档后,我注意到 Singleton 适合访问我的数据库。

引自 Android 开发者:

注意:如果您的应用程序在单个进程中运行,则在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例都相当昂贵,并且您很少需要在单个进程中访问多个实例。

我写了下面一段代码:

@Database(entities = {Category.class, News.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DB_NAME = "database.db";
    private static AppDatabase instance;

    public abstract CategoryDao categoryDao();
    public abstract NewsDao newsDao();

    private AppDatabase () {}

    public static AppDatabase getInstance(Context context) {
        if (instance == null) {
            synchronized (AppDatabase.class) {
                if (instance == null) {
                    instance = Room.databaseBuilder(context.getApplicationContext(),
                            AppDatabase.class, DB_NAME).build();
                }
            } …
Run Code Online (Sandbox Code Playgroud)

singleton android android-room android-jetpack

6
推荐指数
1
解决办法
9256
查看次数

有没有办法将 EncryptedSharedPreference 与 PreferenceScreen 集成?

我是安卓开发的新手。目前,我想加密一个名为 Shared Preference 的自定义并与 PreferenceScreen 集成,但未能这样做。我正在使用依赖项:

  1. androidx.security:security-crypto:1.0.0-alpha02 [EncryptedSharedPreference]
  2. androidx.preference:preference:1.1.0 [PreferenceScreen]

我曾尝试研究有关这两个功能集成的相关信息,但没有找到相关信息。

从我的测试中,我有一个现有的加密共享首选项并测试了以下 API:

getPreferenceManager().setSharedPreferencesName("MyShared"); //MyShared Is custom named preference.
Run Code Online (Sandbox Code Playgroud)

但它最终以普通值保存了偏好。

我的问题:

  1. 在当前阶段是否可以将这两个功能集成在一起?
  2. PreferenceScreen 是否提供我不知道的加密功能?
  3. 如果我坚持使用 EncryptedSharedPreference,我创建一个看起来像首选项屏幕的自定义活动会更好吗?

java sharedpreferences preferencescreen android-jetpack-security

5
推荐指数
2
解决办法
889
查看次数

在 Kotlin 中使用“androidx.preference:preference-ktx:1.1.1”时如何读写 SharedPreferences?

通常,我使用代码 A 或代码 B 来读取或写入 SharedPreferences。

目前,我更新了我的项目以"androidx.preference:preference-ktx:1.1.1"与 Kotlin 一起使用。

当我与 Kotlin 一起使用时,是否有更好的方法来读取和写入 SharedPreferences "androidx.preference:preference-ktx:1.1.1"

代码A

SharedPreferences prfs = getSharedPreferences("AUTHENTICATION_FILE_NAME", Context.MODE_PRIVATE);
String Astatus = prfs.getString("Authentication_Status", "");
Run Code Online (Sandbox Code Playgroud)

代码B

SharedPreferences preferences = getSharedPreferences("AUTHENTICATION_FILE_NAME", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("Authentication_Id",userid.getText().toString());
editor.putString("Authentication_Password",password.getText().toString());
editor.putString("Authentication_Status","true");
editor.apply();
Run Code Online (Sandbox Code Playgroud)

android kotlin androidx

0
推荐指数
1
解决办法
2843
查看次数