Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的应用程序单例使用_Java_Android_Singleton_Facebook Sdk 3.0 - Fatal编程技术网

Java Android中的应用程序单例使用

Java Android中的应用程序单例使用,java,android,singleton,facebook-sdk-3.0,Java,Android,Singleton,Facebook Sdk 3.0,我有一个facebook initialize sdk调用,我需要它在应用程序启动时进行初始化: 我想用我的应用程序类来实现这一点。例如: public class App extends Application { @Override public void onCreate() { super.onCreate(); FacebookSdk.sdkInitialize(getApplicationContext()); } } 我有facebook登录按钮的主要活动: p

我有一个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) {

        }
    });
}
}
public类MainActivity扩展了AppCompatActivity{
@BindView(R.id.login_按钮)
登录按钮登录按钮;
私人CallbackManager CallbackManager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
把(这个)绑起来;
callbackManager=callbackManager.Factory.create();
registerCallback(callbackManager,newfacebookcallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
}
@凌驾
公开作废{
}
@凌驾
public void onError(facebook异常错误){
}
});
}
}

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

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

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

App.getInstance().initFBSdk();

如果这是您在扩展android.app.Application类时所要求的..

,则不必显式调用onCreate。但请确保在AndroidManifest.xml中指定它, 像这样android:name=“完全限定名” 例如:android:name=“com.example.MyApplication”

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


参考

我认为您正在尝试在java中创建线程安全的单例。 以下是我们的
应用程序
课程所需的代码:

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;
    }
}
public class MainActivity extends AppCompatActivity
{
    ...

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

        initFacebookSdk();

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

import static your.package.name.SingletonApp.getAppInstance;
例如,您可以在
MainActivity
类中使用它,只需调用方法
initFacebookSdk()
,如下所示:

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;
    }
}
public class MainActivity extends AppCompatActivity
{
    ...

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

        initFacebookSdk();

        ...
    }
}

android studio标签用于询问应用程序启动时应用程序类运行的工具,那么您的问题是什么?您想手动运行它吗?私有应用程序构造函数将无法工作,因为系统将无法实例化它。@MBengueasane您认为这是一条语句还是一条语句?如果是一个声明,我会要求你先测试它,然后再错误地评论和误导用户。谢谢你!我得到一个错误:
java.lang.IllegalAccessException:private App()无法从类android.App.Instrumentation访问
我发布了一个在我的项目中使用的解决方案。无论如何,我更新了我的解决方案,如果android无法实例化应用程序obj,它应该如何启动你的应用程序?应用程序构造函数应该可以为android访问。你不应该隐藏它。使构造函数私有将引发
java.lang.IllegalAccessException:在应用程序启动期间不允许访问构造函数的错误。另外
synchronized()
中显示错误
不能从静态上下文引用
这是Java中的通用单例设计模式,在Android“应用程序类”中不起作用,因为应用程序类由ART通过其构造函数调用,因此构造函数不能是私有的。要在应用程序启动时初始化SDK,只需在onCreate中初始化,它将在任何活动/服务之前运行应用程序类。