如何使用@Singleton of Guice?

时间:2011-12-13 12:27:55

标签: android guice

我需要创建一个类的一个实例 - 这个实例需要可以从代码中的任何位置访问。

所以,我找到了Guice ......我想从这个包中使用'@Singleton',但我找不到任何示例或一些doc如何使用它以及如何进行声明。

3 个答案:

答案 0 :(得分:7)

@Singleton非常容易使用。它就像这样

@Singleton
public class A {

    @Inject
    public A() {
    }
}

但请注意,单例是每个注射器一个,而不是每个VM。 Singleton是一种范围类型,GUICE还允许自定义范围非常有用。请参阅以下链接。

当你在另一个班级中使用它时,你只需要注入它。

public class B {
   @Inject
   public B(A a) {
   }
}

http://code.google.com/p/google-guice/wiki/Scopes

http://code.google.com/p/google-guice/wiki/GettingStarted

答案 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