有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java应用程序单例在Android中的使用

我有一个facebook initialize sdk调用,我需要它在应用程序启动时进行初始化:

我想用我的应用程序类来实现这一点。例如:

public class App extends Application {

@Override
public void onCreate() {
    super.onCreate();
    FacebookSdk.sdkInitialize(getApplicationContext());
}
}

我有facebook登录按钮的主要活动:

public class MainActivity extends AppCompatActivity {
@BindView(R.id.login_button)
LoginButton loginButton;

private CallbackManager callbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    callbackManager = CallbackManager.Factory.create();
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {

        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onError(FacebookException error) {

        }
    });
}
}

如何将我的应用程序称为singleton?如何使其onCreate()工作


共 (3) 个答案

  1. # 1 楼答案

    当你扩展android的时候。应用程序。应用程序类,则不必显式调用onCreate。但请确保在AndroidManifest中指定它。xml, 像这样的android:name=“完全限定名” 例如:android:name=“com.example.MyApplication”

    您不必实现单例模式,因为应用程序已经是单例,您的应用程序只有一个实例。 而且,要获取应用程序的实例或您定义的应用程序的任何自定义子级,只需调用上下文即可。getApplication()

    参考https://developer.android.com/reference/android/app/Application.html

  2. # 2 楼答案

    我认为您正在尝试在java中创建线程安全的单例。 下面是我们的App类所需的代码:

    public class App extends Application 
    {
        private static App instance;
    
        public static App getAppInstance() { return instance; }
    
        @Override
        public void onCreate() 
        {
            super.onCreate();
            instance = this;
        }   
    
        public void initFacebookSdk()
        {
            FacebookSdk.sdkInitialize(getApplicationContext());
        }
    }
    

    这只是一个自我参照。我们想要实现一个用于多线程的单实例。然后,我们将创建另一个类,该类将App类封装在其构造函数中,如下所示:

    public class SingletonApp
    {
        private static App appInstance = null;
        private static SingletonApp instance = null;
        private static final Object mutex = new Object();
    
        public static SingletonApp getInstance() 
        {
            SingletonApp r = instance;
            if (r == null) {
                synchronized (mutex) {  // While we were waiting for the sync, another 
                    r = instance;       // thread may have instantiated the object.
                    if (r == null) {  
                        r = new SingletonApp();
                        instance = r;
                    }
                }
            }
    
            return r;
        }
    
        private SingletonDemo()
        {
           // Direct access the Application context calling
           appInstance = App.getAppInstance();
        }
    
        public static getAppInstance()
        {
           return getInstance().appInstance;
        }
    }
    

    然后在MainActivity类中,您可以导入静态实例并在代码中使用它:

    import static your.package.name.SingletonApp.getAppInstance;
    

    例如,您可以在MainActivity类中使用它,只需调用方法initFacebookSdk(),如下所示:

    public class MainActivity extends AppCompatActivity
    {
        ...
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initFacebookSdk();
    
            ...
        }
    }
    
  3. # 3 楼答案

    要使您的应用程序类singleton遵循单例设计模式

    public class App
      {
        // Create the instance
        private static App instance;
        public static App getInstance()
        {
             if (instance== null) {
                    synchronized(App.class) {
                            if (instance == null)
                                    instance = new App();
                            }
                    }
                    // Return the instance
                    return instance;
        }
    
        private App()
        {
            // Constructor hidden because this is a singleton
        }
    
        public void initFBSdk()
        {
            FacebookSdk.sdkInitialize(getApplicationContext());
        }
    }
    

    然后在任何其他类中使用它:

    App.getInstance().initFBSdk();
    

    如果这是你想要的