我需要创建一个类的一个实例 - 这个实例需要可以从代码中的任何位置访问。
所以,我找到了Guice ......我想从这个包中使用'@Singleton',但我找不到任何示例或一些doc如何使用它以及如何进行声明。
答案 0 :(得分:7)
@Singleton非常容易使用。它就像这样
@Singleton
public class A {
@Inject
public A() {
}
}
但请注意,单例是每个注射器一个,而不是每个VM。 Singleton是一种范围类型,GUICE还允许自定义范围非常有用。请参阅以下链接。
当你在另一个班级中使用它时,你只需要注入它。
public class B {
@Inject
public B(A a) {
}
}
答案 1 :(得分:4)
好的,我的答案不是针对@Singleton of Guice 的具体内容,但是如果你想创建一个可通过所有活动访问的课程,那么我想,你必须使用 Android的应用程序类。 (这是我个人对你的需求的意见)
执行此操作的方法是创建自己的android.app.Application
子类,然后在清单中的应用程序标记中指定类。现在,Android将自动创建该类的实例,并使其可用于整个应用程序。您可以使用Context.getApplicationContext()
方法从任何上下文访问它(Activity还提供了具有完全相同效果的方法getApplication()
):
class MyApp extends Application {
private String myState;
public String getState(){
return myState;
}
public void setState(String s){
myState = s;
}
}
class Blah extends Activity {
@Override
public void onCreate(Bundle b){
...
MyApp appState = ((MyApp)getApplicationContext());
String state = appState.getState();
...
}
}
这与使用静态变量或单例具有基本相同的效果,但与现有的Android框架完全集成。请注意,这不适用于整个流程(如果您的应用程序是少数具有多个流程的应用程序之一)。
以下是有关如何使用它的精彩教程Extending the Android Application class and dealing with Singleton
答案 2 :(得分:1)
public class DestinationViewManger {
private static final DestinationViewManger instance = new DestinationViewManger();
public Boolean flag=false;
// Private constructor prevents instantiation from other classes
private DestinationViewManger(){ }
public static DestinationViewManger getInstance() {
return instance;
}
}
//尝试一次这个单例类。不需要getter和setter方法
DestinationViewManger dstv;
dstv=DestinationViewManger.getInstance();
dstv.flag=true; //set the value for your flag
boolean whatFlagboo=dstv.flag; //get your flag wherever you want