java Android中的应用单例使用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/43197379/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Application singleton use in Android
提问by Ackman
I have a facebook initialize sdk call and I need it to initialize the moment application is launched:
我有一个 facebook 初始化 sdk 调用,我需要它来初始化应用程序启动的那一刻:
I want to use my Application class to do that. for example:
我想使用我的 Application 类来做到这一点。例如:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
FacebookSdk.sdkInitialize(getApplicationContext());
}
}
I have the main activity with the facebook login button:
我有 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) {
}
});
}
}
How do I call my Application singleton? How do I make its onCreate() work?
我如何调用我的应用程序单例?我如何使它的 onCreate() 工作?
采纳答案by Anmol
To make your App class singleton
follow the Singleton design pattern:
要使您的 App 类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());
}
}
Then to use it in any other class:
然后在任何其他类中使用它:
App.getInstance().initFBSdk();
If this is what you are asking for..
如果这就是你所要求的..
回答by Seeker
When you extend android.app.Application class, you do not have to call onCreate explicitly. But make sure you specify it in AndroidManifest.xml, like this android:name="fully-qualified name"eg: android:name="com.example.MyApplication"
当您扩展 android.app.Application 类时,您不必显式调用 onCreate。但请确保在 AndroidManifest.xml 中指定它,例如android:name="fully-qualified name"例如:android:name="com.example.MyApplication"
You don't have to implement Singleton pattern cause Application IS ALREADY A SINGLETON, there is only one instance of your Application. And, to get theinstance of Application or the any custom child of Application you defined, you can simply call context.getApplication().
您不必实现单例模式,因为Application IS ALREADY A SINGLETON,您的应用程序只有一个实例。而且,要获取Application的实例或您定义的 Application 的任何自定义子项,您只需调用context.getApplication() 即可。
Reference https://developer.android.com/reference/android/app/Application.html
参考https://developer.android.com/reference/android/app/Application.html
回答by Teocci
I think you are trying to make a thread safe singleton in java.
Here is the code that you need for our App
class:
我认为您正在尝试在 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());
}
}
This only makes a reference to itself. We want to implement a Singleton for Multithreading. Then we will create another class that encapsulates the App
class in its constructor, like this:
这只是对自身的引用。我们想为多线程实现一个单例。然后我们将创建另一个类,将类封装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;
}
}
Then in your MainActivity
class you can import the static instance and use it on your code:
然后在您的MainActivity
类中,您可以导入静态实例并在您的代码中使用它:
import static your.package.name.SingletonApp.getAppInstance;
For example, you can use it in your MainActivity
class just calling the method initFacebookSdk()
like this:
例如,您可以在MainActivity
类中使用它,只需initFacebookSdk()
像这样调用方法:
public class MainActivity extends AppCompatActivity
{
...
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFacebookSdk();
...
}
}