RoboGuice
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

RoboGuice

on

  • 1,500 views

Presentation about RoboGuice for Android.

Presentation about RoboGuice for Android.

Statistics

Views

Total Views
1,500
Views on SlideShare
1,497
Embed Views
3

Actions

Likes
2
Downloads
15
Comments
0

1 Embed 3

http://www.linkedin.com 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • OnActivityResultEventOnConfigurationChangedEventOnContentChangedEventOnContentViewAvailableEventOnCreateEventOnDestroyEventOnNewIntentEventOnPauseEventOnRestartEventOnResumeEventOnStartEventOnStopEvent

RoboGuice Presentation Transcript

  • 1. RoboGuice
    well-known DI framework for Android
    5/7/2011
    1
    Android May Days 2011
  • 2. Dependency Injection
    Устранение зависимостей в коде
    Замена паттерна new()
    Избавление от рутины создания фабрик, заводов и цехов
    Возможность использования нескольких конфигураций
    Ограничение кол-ва инстанций класса
    Упрощение тестирования
    5/7/2011
    Android May Days
    2
  • 3. RoboGuice
    http://code.google.com/p/roboguice/
    Первым делом, это DI фрэймворк, который также позволяет:
    @InjectView()
    @InjectResource()
    @InjectPreference()
    @Inject System Services
    @ObservesEvents
    5/7/2011
    I’m footer and nobody reads me
    3
  • 4. Injecting RoboGuice
    СкачатьRoboGuice 1.1.1 и guice-2.0-no_aop.jar и подключить их к проекту. Или есть прекрасная возможность начать пользоваться Maven’ом
    (чего я еще не сделал)
    Добавить в проект класс наследник RoboApplication и прописать его в AndroidManifest.xlmв тэге application значением параметра android:name (“.MyRoboApplication”)
    5/7/2011
    Damn footer live
    4
  • 5. Application Code Sample
    5/7/2011
    publicclassDiscoBoxApplicationextendsRoboApplication {
    @Override
    protectedvoidaddApplicationModules(List<Module> modules) {
    modules.add(newNetSocketModule());
    modules.add(newDiscoBoxModule());
    super.addApplicationModules(modules);
    }
    }
    I’m a poop-poor footer, no one likes me
    5
  • 6. Modules
    Происходит настройка bind-ингов классов на конкретные объекты
    Статическая инициализация
    5/7/2011
    I could be a header
    6
    bind(Client.class).to(SocketClient.class);
    @Providespublic Client provideClient() {
    Client c = newSocketClient();
    requestInjection(c);
    return c;
    }
    requestStaticInjection(ClientServiceAPI.class);
  • 7. Module Sample
    5/7/2011
    footer sample
    7
    publicclassNetSocketModuleextendsAbstractModule {
    publicstaticfinal String SERVER_BROADCAST_IN_PORT = "SERVER_BROADCAST_IN_PORT";
    publicstaticfinal String SERVER_BROADCAST_OUT_PORT = "BROADCAST_OUT_PORT";
    publicstaticfinal String SO_TIMEOUT = "SO_TIMEOUT";
    privatestaticfinalintSERVER_BROADCAST_IN_PORT_VALUE = 2012;
    privatestaticfinalintSERVER_BROADCAST_OUT_PORT_VALUE = 2013;
    privatestaticfinalintSO_TIMEOUT_VALUE = 20 * 1000;
    @Override
    protectedvoid configure() {
    bind(ProtocolProcessor.class).to(DefaultProtocolProcessor.class);
    bind(Connection.class).to(DefaultConnection.class);
    bind(Client.class).to(SocketClient.class);
    bind(Server.class).to(SocketServer.class).in(Scopes.SINGLETON);
    bind(ServerFinder.class).to(SocketServerFinder.class);
    bind(Integer.class).annotatedWith(Names.named(SO_TIMEOUT))
    .toInstance(SO_TIMEOUT_VALUE);
    bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT))
    .toInstance(SERVER_BROADCAST_IN_PORT_VALUE);
    bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT))
    .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE);
    }
    }
  • 8. Injecting
    С помощью @Inject
    C помощью Injector
    5/7/2011
    blah-blah-blah
    8
    @Inject
    protected Injector injector;
    @Inject
    publicSocketServer(@Named(NetSocketModule.SERVER_PORT) intport) {
    ...
    }
    @Inject
    publicvoidsetProtocolProcessor(ProtocolProcessor processor) {
    this.processor = processor;
    }
    Connection connection = injector.getInstance(Connection.class);
  • 9. Lazy Injection
    Использование интерфейса Provider<T>
    5/7/2011
    and lazy footer
    9
    @Injectpublic Provider<Server> serverProvider;
    publicvoidmethodRequersServer() {
    Server servet = serverProvider.get();
    ...
    }
  • 10. Scopes
    Можно пометить класс аннотацией @Singleton, для ограничения кол-ва инстанций тяжелого ресурсоемкого класса
    5/7/2011
    scopes looks like footer friends
    10
    @Singleton
    publicclassSocketServerimplements Server {
    ...
    }
  • 11. Constructors with params
    Использование аннотаций и специальных биндингов
    5/7/2011
    what footers are good for?
    11
    @Inject
    publicSocketServer(@Named(NetSocketModule.SERVER_PORT) int port,
    @Named(NetSocketModule.SERVER_BROADCAST_ADDRESS) String broadcastAddress,
    @Named(NetSocketModule.SERVER_BROADCAST_IN_PORT) intbroadcastInPort,
    @Named(NetSocketModule.SERVER_BROADCAST_OUT_PORT) intbroadcastOutPort) {
    }
    @Override
    protectedvoid configure() {
    ...
    bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT))
    .toInstance(SERVER_BROADCAST_IN_PORT_VALUE);
    bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT))
    .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE);
    bind(String.class).annotatedWith(Names.named(SERVER_BROADCAST_ADDRESS))
    .toInstance(SERVER_BROADCAST_ADDRESS_VALUE);
    }
  • 12. Constructors with params
    Использование @Provides в модуле
    5/7/2011
    footer is watching you
    12
    @Provides Server provideServer() {
    Server server = newSocketServer(2011, "224.0.0.0", 2013, 2014);
    requestInjection(server);
    return server;
    }
  • 13. Events
    Использовать уже готовые событий или написать свои
    5/7/2011
    footer, simple as is
    13
    publicvoidperformShutDown(@ObservesOnDestroyEvent event) {
    doSomeCleanUp();
    }
    @Inject protectedEventManagereventManager;
    protectedvoid buy() {
    eventManager.notify(MyOtherActivity.this, newMyBuyEvent() );
    }
    protectedvoidhandleBuy(@ObservesMyBuyEventbuyEvent ) {
    Toast.makeToast(this, "You won't regret it!", Toast.LENGTH_LONG).show();
    }
    //The event class can be anything you want
    publicclassMyBuyEvent {
    ...
    }
  • 14. Views
    Устранение лишнего,повторяющегося от активити к активити нудного тупого обезьяньего кодаfindViewById(R.id.damn_view_id) в onCreate()
    5/7/2011
    cool footer is not a crime
    14
    @InjectView(R.id.server_search_button_panel)ViewSwitchersearchButtonSwitcher;
    @InjectView(R.id.server_selector)Spinner serverSelector;
    @InjectView(R.id.server_search_button) Button searchButton;
    @InjectView(R.id.client_music_mode_button) Button musicModuleButton;
  • 15. Logging
    RoboGuice'sLn logger
    Отличный формат вызова
    Автоматическое отключение debug и verbose логов при release-ой сборке
    В тэге лога сам пишет класс и номер строки кода
    Можно легко переопределить формат отображения и перенаправить вывод лога в файл
    5/7/2011
    we footers hate each other
    15
    Ln.d("text");
    Ln.d("formatted %s", "text");
    Ln.d(exception, "reason %s", "text");
  • 16. Спасибо за внимание
    Презентацию подготовил
    Шауберт Александр shaubert.alexander@gmail.com
    Специально для Android May Days 2011
    5/7/2011
    and who will say thanks to footer
    16