Java Android中的应用程序单例使用
我有一个facebook initialize sdk调用,我需要它在应用程序启动时进行初始化: 我想用我的应用程序类来实现这一点。例如: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
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中初始化,它将在任何活动/服务之前运行应用程序类。