Android RoboGuice 使用指南(7):@Provides Methods

jerry Android 2015年08月24日 收藏

上例说过如果需要构造一些较复杂的类的实例,通常的方法是使用@Provides 方法。这个方法必须定义在模块中(Module),而且必须使用@Provides 标注,在个方法的返回类型则绑定到这个方法返回的对象实例。

如果这个方法带有binding Annotation 或是@Named(“xxx”),Guice则将@Provides方法返回的对象绑定到这个annotated 类型。

本例使用@Provides创建三个圆,然后再屏幕上显示出来,图形库的使用可以参见Android简明开发教程十二:引路蜂二维图形库简介及颜色示例 。其实创建圆并不复杂,这里只是用来说明@Provides 方法的用法。

在Graphics2DModule 在添加三个@Provides方法:

  1. @Provides @Named("Circle1")
  2. IShape provideCircle1(){
  3. return new Ellipse(30,60,80,80);
  4. }
  5.  
  6. @Provides @Named("Circle2")
  7. IShape provideCircle2(){
  8. return new Ellipse(60,30,80,80);
  9. }
  10.  
  11. @Provides @Named("Circle3")
  12. IShape provideCircle3(){
  13. return new Ellipse(90,60,80,80);
  14. }

分别绑定到IShape带有标注@Named(“Circle1″),@Named(“Circle2″),@Named(“Circle3″).

创建ProvidesMethodsDemo,有如下代码

  1. public class ProvidesMethodsDemo extends Graphics2DActivity{
  2.  
  3. @Inject @Named("Circle1") IShape circle1;
  4. @Inject @Named("Circle2") IShape circle2;
  5. @Inject @Named("Circle3") IShape circle3;
  6.  
  7. protected void drawImage(){
  8.  
  9. // The solid (full opaque) red color in the ARGB space
  10. Color redColor    = new Color(0xffff0000);
  11.  
  12. // The semi-opaque green color in the ARGB space (alpha is 0x78)
  13. Color greenColor = new Color(0x7800ff00,true);
  14.  
  15. // The semi-opaque blue color in the ARGB space (alpha is 0x78)
  16. Color blueColor = new Color(0x780000ff,true);
  17.  
  18. // The semi-opaque yellow color in the ARGB space ( alpha is 0x78)
  19. Color yellowColor = new Color(0x78ffff00,true);
  20.  
  21. // The dash array
  22. int dashArray[] = { 20 ,8 };
  23. graphics2D.clear(Color.WHITE);
  24. graphics2D.Reset();
  25. SolidBrush brush=new SolidBrush(redColor);
  26. graphics2D.fill(brush,circle1);
  27. brush=new SolidBrush(greenColor);
  28. graphics2D.fill(brush,circle2);
  29. Pen pen=new Pen(yellowColor,10,Pen.CAP_BUTT,Pen.JOIN_MITER,dashArray,0);
  30. brush=new SolidBrush(blueColor);
  31. graphics2D.setPenAndBrush(pen,brush);
  32. graphics2D.fill(null,circle3);
  33. graphics2D.draw(null,circle3);
  34.  
  35. }
  36.  
  37. }

@Provides方法通常用来创建将复杂的类对象,可以带参数,参数也可以通过注入传入比如:

  1. @Provides @Named("Circle1")
  2. IShape provideCircle1(@Named("width") int width){
  3. return new Ellipse(30,60,width,width);
  4. }