SlideShare une entreprise Scribd logo
1  sur  81
Télécharger pour lire hors ligne
•Moderne App-Architektur mit
Dagger2 und RxJava
•
code.talks 2015
Martin Breuer
http://www.gedankensuppe.de/hamburg
Dominik Helleberg
+DominikHelleberg
Mobile  Application  Development
Tools
Android  /  Embedded
Angelo Rüggeberg
+AngeloRüggeberg
Google  Developer  Group,  Munich |  Lead
Mobile  Application  Development
Android  Enthusiast
Since  Cupcake  (Version  1.5)  
Why?
App  Architektur
App  Architektur
App  Architektur
Themen
• Dependency Injection
• MV(i)P
• RxJava
Dependency Injection
• Your class get’s what it needs (Dependenciescome
to you)
• You have no idea where they come from
• A well known pattern
• Everyone uses it (more or less)
App  Architektur
Dependency Injection
Dependency Injection
• It’s common sense on the server side
• There are already frameworks out there:
–Spring DI
–Google Guice
–Pico Container
–...
App  Architektur
Dependency Injection
Dependency Injection - Android
Now what about android?
• Mobile (limited ressources)
• App Startup time does really matter
• Reflection is slow
• App Size + method count does really matter
App  Architektur
Dependency Injection
Dagger 2
Why another Framework?
• no reflection at all
• Based on Dagger1
• Proposed + Implemented by the Java Core Team (Google)
• Code generation (As if you would write it)
App  Architektur
Dependency Injection
Dagger 2 - Basics
@Modules / @Provides
• Provide Dependenciesto
@Inject
• Requests for Dependencies
@Components
• Public API, the Bridge between Modules and Injects
and some more...
App  Architektur
Dependency Injection
Dagger2
TwitterTimeline
(interface)
TwitterTimeline RestAdapter
MockTwitter
Timeline
HTTPClient
App  Architektur
Dependency Injection
Dagger2
TwitterTimeline
RestAdapter
MockTwitter
Timeline
MockNetworkModule
NetworkModule
ApplicationComponent
Mock
ApplicationComponent
App  Architektur
Dependency Injection
@Singleton
@Component
(modules =  {ApplicationModule.class,   NetworkingModule.class})
public interface ApplicationComponent {
MVPComponent plus();;
}
App  Architektur
Dependency Injection
@Module
public class NetworkingModule {
@Provides
@Singleton
TwitterTimeline provideTwitterTimeline(RestAdapter restAdapter)  {
return restAdapter.create(TwitterTimeline.class);;
}
@Provides
@Singleton
public RestAdapter provideRestAdapter(SigningOkClient client)  {
return TwitterApiAdapter.getInstance(client);;
}
App  Architektur
Dependency Injection
@Inject
TwitterTimeline  timeline;;
App  Architektur
Dependency Injection
@Module
public  class  MockNetworkingModule   extends  NetworkingModule   {
@Provides
@Singleton
TwitterTimeline  provideTwitterTimeline()   {
return  new  MockTwitterTimeline();;
}
}
App  Architektur
Dependency Injection
Dagger2
• DI is a good thing to have
• steep learning curve
• Sometimes hard to get hold on component
references
• Still under active development
• Enforces structured code
• Code generation is a good thing
App  Architektur
Dependency Injection
Model View Presenter (MViP)
• Seperate Business Logic, Application Logic, Display
Logic
• Change independent parts without Issues
• Easier to Test
–Mock Network Modules etc.
App  Architektur
MViP
MViP: Components
• Model
–Data that is represented
–for example Tweets
• View
–The View Displaying the Data
–can be Activity, Fragment, CustomView
• Presenter
–Logic
–for example fetching Tweets from Network
App  Architektur
MViP
MVP: Components
https://blog.8thlight.com/uncle-­bob/2012/08/13/the-­clean-­architecture.html
App  Architektur
MViP
Example
App  Architektur
MViP
App  Architektur
MViP
Activity
fetchFeed()
updateFeed(List  Feed)
updateListitem(item)
onTextChanged()
MViP: Model
• The Data that is displayed to the User
• Data used to do Interactions with the Presenter
• Can be the same as the Models for Network
Requests
–Retrofit
App  Architektur
MViP
public  class  Tweet  {    
@JsonProperty("created_at")
private  String  DateCreated;;
@JsonProperty("id")
private  long  Id;;
@JsonProperty("text")
private  String  Text;;
@JsonProperty("user")
private  TwitterUser  User;;
}
App  Architektur
MViP -­‐ Model
• Interface
• Actual Display Unit Implements Interface
–Fragment, Activity, Custom View, whatever…
• Views should be dumb!
–Only react to Actions
• No Business Logic in here
MVP: View
App  Architektur
MViP
public  interface  TwitterTimelineView  {
void  showLoading();;
void  hideLoading();;
void  showFeed(List<Tweet>  messages);;
void  showError(String  errorMessage);;
}
App  Architektur
MViP -­‐ View
class HashtagFeedActivity extends BaseActivity implements
TwitterTimelineView {
@Override
public void showLoading()           {  … }
@Override
public void hideLoading()   {  … }
@Override
public void showFeed(List<Tweet>  messages)  {  … }
@Override
public void showError(String  errorMessage)  {  …  }
App  Architektur
MViP -­‐ View
class HashtagFeedActivity extends BaseActivity implements
TwitterTimelineView {
@Override
public void showLoading()           {  …  }
@Override
public void hideLoading()   {  …  }
@Override
public void showFeed(List<Tweet>  messages)  {  …  }
@Override
public void showError(String  errorMessage)  {  …  }
App  Architektur
MViP -­‐ View
class HashtagFeedActivity extends BaseActivity implements
TwitterTimelineView {
@Override
public void showLoading()           {  … }
@Override
public void hideLoading()   {  … }
@Override
public void showFeed(List<Tweet>  messages)  {  … }
@Override
public void showError(String  errorMessage)  {  …  }
App  Architektur
MViP -­‐ View
Presenter
• Interface
• Binds to the View
• Business Logic in here
App  Architektur
MViP
public  interface  Presenter<T>  {
void  onDestroy();;
void  bindView(T  view);;
void  unbindView();;
}
App  Architektur
MViP -­‐ Presenter
public interface TwitterHashtagTimelinePresenter
extends Presenter<TwitterTimelineView>{
void bindSearchView(EditText textView);;
void loadHashtagTimeline(String   hashtag);;
void goToDetails(Activity context,  Tweet  t);;
}
App  Architektur
MViP -­‐ Presenter
public interface TwitterHashtagTimelinePresenter
extends Presenter<TwitterTimelineView>{
void bindSearchView(EditText textView);;
void loadHashtagTimeline(String   hashtag);;
void goToDetails(Activity context,  Tweet  t);;
}
App  Architektur
MViP -­‐ Presenter
public class TwitterHashtagTimelinePresenterImpl
implements TwitterHashtagTimelinePresenter {
private  TwitterTimelineView view;;
@Override
public void bindView(TwitterTimelineView view)  {
this.view =  view;;
}
@Override
public void loadHashtagTimeline(String   hashtag)  {
…  Do  Network  Request  ...
}
App  Architektur
MViP -­‐ Presenter
public class TwitterHashtagTimelinePresenterImpl
implements TwitterHashtagTimelinePresenter {
private  TwitterTimelineView view;;
@Override
public void bindView(TwitterTimelineView view)  {
this.view =  view;;
}
@Override
public void loadHashtagTimeline(String   hashtag)  {
…  Do  Network  Request  ...
}
App  Architektur
MViP -­‐ Presenter
public class TwitterHashtagTimelinePresenterImpl
implements TwitterHashtagTimelinePresenter {
private  TwitterTimelineView view;;
@Override
public void bindView(TwitterTimelineView view)  {
this.view =  view;;
}
@Override
public void loadHashtagTimeline(String   hashtag)  {
…  Do  Network  Request  ...
}
App  Architektur
MViP -­‐ Presenter
public class TwitterHashtagTimelinePresenterImpl
implements TwitterHashtagTimelinePresenter {
private  TwitterTimelineView view;;
@Override
public void bindView(TwitterTimelineView view)  {
this.view =  view;;
}
@Override
public void loadHashtagTimeline(String   hashtag)  {
…  Do  Network  Request  ...
}
App  Architektur
MViP -­‐ Presenter
@Override
public  void  loadHashtagTimeline(String   hashtag)  {
view.showLoading();;
List<Tweet>  tweets  =  interactor.loadHashtagTweets(hashtag);;
view.showTweets(tweets);;
view.hideLoading();;
}
App  Architektur
MViP -­‐ Presenter
@Override
public  void  loadHashtagTimeline(String   hashtag)  {
view.showLoading();;
List<Tweet>  tweets  =  interactor.loadHashtagTweets(hashtag);;
view.showTweets(tweets);;
view.hideLoading();;
}
App  Architektur
MViP -­‐ Presenter
@Override
public  void  loadHashtagTimeline(String   hashtag)  {
view.showLoading();;
List<Tweet>  tweets  =  interactor.loadHashtagTweets(hashtag);;
view.showTweets(tweets);;
view.hideLoading();;
}
App  Architektur
MViP -­‐ Presenter
Interactor?
• Do not bloat up Presenters!
• Interactors are used for doing things
–Fetching Stuff from the network
–Fetching Stuff from Disk
• Interface again!
App  Architektur
MViP -­‐ interactor
public interface TwitterTimelineInteractor {
void loadUserTweets(Observer<?  super  List<Tweet>>  
observer,  String  username);;
void loadHashtagTweets(Observer<?   super  List<Tweet>>  
observer,  String  hastag);;
Observable<List<Tweet>>  loadHashtagTweets(String  
hashtag);;
void pollHashtagTweets(Observer<?   super  List<Tweet>>  
observer,  String  hashtag);;
}
App  Architektur
MViP -­‐ interactor
public class TwitterTimelineInteractorImpl
implements TwitterTimelineInteractor {
TwitterTimeline twitterTimeline;;
@Override
public void loadUserTweets(Observer<?   super  List<Tweet>>  
observer,  String  username)  {
twitterTimeline
.getUserTimeline(username)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);;
}
App  Architektur
MViP -­‐ interactor
App  Architektur
Summary
Activity
textChangeObservable
Presenter
bindView()
Adapter
showFeed()
setTweets()
loadHashtagTimelineFeed
showFeed()
Interactor
loadHashtagTimeline
Why?
• Push don’t Poll!
–do not stress the UI
–do not stress the Application
• Avoid Lifecycle Problems
• Avoid the Callback Hell
• Death to:
–Boilerplate Code
–AsyncTasks, Timertasks, Loaders, etc...
App  Architektur
RXJava
RX: What?
• Programming Paradigm based on asynchronous
Data Flow
• Idea from the late 90s
• Erik Meijer (Microsoft) developed first RX extension
for .NET
• Adapted by many Programming languages
App  Architektur
RXJava
RX: What?
• Ported to JVM by Ben Christensen and Jafar Husain
(Netflix)
–Java, Closure, Groovy, Scala, etc etc….
• RXJava -> RXAndroid
• The Observer pattern done right.
App  Architektur
RXJava
http://reactivex.io/
RX: What?
App  Architektur
RXJava
RXAndroid: How?
• Producing Entities:
–Observables
–Subjects
• Consuming Entities:
–Observers
–Subscribers
• Consuming Entities subscribe to Producing Entities
App  Architektur
RXJava
RXAndroid: Setup
compile 'io.reactivex:rxandroid:1.0.1'
//optional
compile 'io.reactivex:rxjava:1.0.14'
App  Architektur
RXJava
Observers
Lifecycle:
–onNext(T):
• gets called when new Data is emited with the
Data
–onCompleted():
• gets called when the Sequence is done
–onError(Throwable):
• gets called when an Error occured
App  Architektur
RXJava
Observables
• Sequence that emits data
–can emit more than once
• Lives as long as there is work to do
• Observers subscribe to an Observable
• When there is no Subscriber, the Observable emits
the data nowhere
App  Architektur
RXJava
Sequence Example
Observable
Emits  Something  every  Second
App  Architektur
RXJava
Sequence Example
Observable
Observer
Subscribe Unsubscribe
onNext(T);;
App  Architektur
RXJava
Observable<Long>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS);;
App  Architektur
RXJava
interval.subscribe(new Observer<Long>()  {
@Override
public void onCompleted()  {
Timber.d("onCompleted");;
}
@Override
public void onError(Throwable e)  {
Timber.e(e,  e.getMessage());;
}
@Override
public void onNext(Long  aLong)  {
Timber.d("Tick:  "  +  aLong.toString());;
App  Architektur
RXJava
Transforming the Data
• We do not want a Long as result, we want a String
• map()
–gets the Long value
–returns a String value
• Chainable!
–map().map().map().map().............map()
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(new  Func1<Long,  String>()  {
@Override
public  String  call(Long  aLong)  {
return  "Tick:  "  +  aLong.toString();;
}
});;
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(new  Func1<Long,  String>()  {
@Override
public  String  call(Long  aLong)  {
return  "Tick:  "  +  aLong.toString();;
}
});;
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(new  Func1<Long,  String>()  {
@Override
public  String  call(Long  aLong)  {
return  "Tick:  "  +  aLong.toString();;
}
});;
Returns Long
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(new  Func1<Long,  String>()  {
@Override
public  String  call(Long  aLong)  {
return  "Tick:  "  +  aLong.toString();;
}
});;
Takes the Long
Transforms the Data
and returns a String
App  Architektur
RXJava
Hello Again Boilerplatecode
• new Func1<T, T>() { public T call(t t2) { … } for every
mapping will turn the code really unreadable and
bloated
• Lambda to the Rescue!
–retrolambda for android & gradle
–https://github.com/evant/gradle-retrolambda
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(new  Func1<Long,  String>()  {
@Override
public  String  call(Long  aLong)  {
return  "Tick:  "  +  aLong.toString();;
}
});;
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(aLong  -­>  "Tick:  "  +  aLong.toString());;
App  Architektur
RXJava
Observable<String>  interval  =  Observable
.interval(1,  TimeUnit.SECONDS)
.map(aLong  -­>  aLong.toString())
.map(string  -­>  "Tick:  "  +  string);;
App  Architektur
RXJava
Combining Observables
• Prevent Callback hell
• Easy to Synchronize for async Operations
• Running 2 Network Calls and combine the
Results
• Combine onTextChanged events from two fields
• etc.
• .zip(), combineLatest()
App  Architektur
RXJava
Observable.combineLatest(
WidgetObservable.text(txt1,  false),  
WidgetObservable.text(txt2,  false),
(event1,  event2)  -­>  event1.text().toString()  +  
event2.text().toString()
).subscribe(combined  -­>  {
Timber.d(combined);;
});;
App  Architektur
RXJava
Observable.combineLatest(
WidgetObservable.text(txt1,  false),  
WidgetObservable.text(txt2,  false),
(event1,  event2)  -­>  event1.text().toString()  +  
event2.text().toString()
).subscribe(combined  -­>  {
Timber.d(combined);;
});;
App  Architektur
RXJava
Observable.combineLatest(
WidgetObservable.text(txt1,  false),  
WidgetObservable.text(txt2,  false),
(event1,  event2)  -­>  event1.text().toString()  +  
event2.text().toString()
).subscribe(combined  -­>  {
Timber.d(combined);;
});;
App  Architektur
RXJava
Observable.combineLatest(
WidgetObservable.text(txt1,  false),  
WidgetObservable.text(txt2,  false),
(event1,  event2)  -­>  event1.text().toString()  +  
event2.text().toString()
).subscribe(combined  -­>  {
Timber.d(combined);;
});;
App  Architektur
RXJava
Observable.combineLatest(
WidgetObservable.text(txt1,  false),  
WidgetObservable.text(txt2,  false),
(event1,  event2)  -­>  event1.text().toString()  +  
event2.text().toString()
).subscribe(combined  -­>  {
Timber.d(combined);;
});;
App  Architektur
RXJava
Example: Livesearch
• Retrieve the user Input from a EditText when text
changes
–only after nothing changes for 600 ms
• Add # infront of the input to do a hastag search
• Call the network (via Retrofit)
–returns StatusesResponse Object
• Transform to List<Tweets>
• Show Tweets in view
App  Architektur
RXJava
textChangeObservable
.observeOn(AndroidSchedulers.mainThread())
textChangeObservable
.observeOn(AndroidSchedulers.mainThread())
.map(onTextChangeEvent -­>  onTextChangeEvent.text().toString())
textChangeObservable
.observeOn(AndroidSchedulers.mainThread())
.map(onTextChangeEvent -­>  onTextChangeEvent.text().toString())
.map(searchText -­>  "#"  +  searchText)
textChangeObservable
.observeOn(AndroidSchedulers.mainThread())
.map(onTextChangeEvent -­>  onTextChangeEvent.text().toString())
.map(searchText -­>  "#"  +  searchText)
.subscribe(
tag  -­>  {
Timber.d(tag);;
loadHashtagTimeline(tag);;
}
textChangeObservable
.observeOn(AndroidSchedulers.mainThread())
.map(onTextChangeEvent -­>  onTextChangeEvent.text().toString())
.map(searchText -­>  "#"  +  searchText)
.subscribe(
tag  -­>  {
Timber.d(tag);;
loadHashtagTimeline(tag);;
},
e -­>  {
Timber.e(e,  e.getMessage());;
view.showError(e.getMessage());;
}  );;
textChangeObservable
.debounce(600,  TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.map(onTextChangeEvent -­>  onTextChangeEvent.text().toString())
.map(searchText -­>  "#"  +  searchText)
.subscribe(
tag  -­>  {
Timber.d(tag);;
loadHashtagTimeline(tag);;
},
e -­>  {
Timber.e(e,  e.getMessage());;
view.showError(e.getMessage());;
}  );;
Demo
Thank You!

Contenu connexe

Tendances

Android Modularization
Android ModularizationAndroid Modularization
Android ModularizationYoung-Hyuk Yoo
 
Oleksandr Valetskyy - Become a .NET dependency injection ninja with Ninject
Oleksandr Valetskyy - Become a .NET dependency injection ninja with NinjectOleksandr Valetskyy - Become a .NET dependency injection ninja with Ninject
Oleksandr Valetskyy - Become a .NET dependency injection ninja with NinjectOleksandr Valetskyy
 
Unit Testing Android Applications
Unit Testing Android ApplicationsUnit Testing Android Applications
Unit Testing Android ApplicationsRody Middelkoop
 
Inside Android Testing
Inside Android TestingInside Android Testing
Inside Android TestingFernando Cejas
 
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...DicodingEvent
 
An Introduction to Dependency Inversion Principle
An Introduction to Dependency Inversion PrincipleAn Introduction to Dependency Inversion Principle
An Introduction to Dependency Inversion PrincipleDunith Dhanushka
 
DeNA Technology Seminar #3 - OpenSocial and JavaScript
DeNA Technology Seminar #3 - OpenSocial and JavaScriptDeNA Technology Seminar #3 - OpenSocial and JavaScript
DeNA Technology Seminar #3 - OpenSocial and JavaScriptNaosuke Yokoe
 
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...DicodingEvent
 
MobSecCon 2015 - Dynamic Analysis of Android Apps
MobSecCon 2015 - Dynamic Analysis of Android AppsMobSecCon 2015 - Dynamic Analysis of Android Apps
MobSecCon 2015 - Dynamic Analysis of Android AppsRon Munitz
 
Seeding a Tree in a Gherkin
Seeding a Tree in a GherkinSeeding a Tree in a Gherkin
Seeding a Tree in a GherkinPaul Rohorzka
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An OverviewSmartLogic
 
Barcode scanning on Android
Barcode scanning on AndroidBarcode scanning on Android
Barcode scanning on AndroidPietro F. Maggi
 
Clean architecture on android
Clean architecture on androidClean architecture on android
Clean architecture on androidBenjamin Cheng
 
Static Analysis For Security and DevOps Happiness w/ Justin Collins
Static Analysis For Security and DevOps Happiness w/ Justin CollinsStatic Analysis For Security and DevOps Happiness w/ Justin Collins
Static Analysis For Security and DevOps Happiness w/ Justin CollinsSonatype
 

Tendances (20)

Android Modularization
Android ModularizationAndroid Modularization
Android Modularization
 
Oleksandr Valetskyy - Become a .NET dependency injection ninja with Ninject
Oleksandr Valetskyy - Become a .NET dependency injection ninja with NinjectOleksandr Valetskyy - Become a .NET dependency injection ninja with Ninject
Oleksandr Valetskyy - Become a .NET dependency injection ninja with Ninject
 
Unit Testing Android Applications
Unit Testing Android ApplicationsUnit Testing Android Applications
Unit Testing Android Applications
 
Inside Android Testing
Inside Android TestingInside Android Testing
Inside Android Testing
 
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...
Dicoding Developer Coaching #13: Android | Melakukan Testing secara Otomatis ...
 
An Introduction to Dependency Inversion Principle
An Introduction to Dependency Inversion PrincipleAn Introduction to Dependency Inversion Principle
An Introduction to Dependency Inversion Principle
 
Ci/CD Android
Ci/CD AndroidCi/CD Android
Ci/CD Android
 
DeNA Technology Seminar #3 - OpenSocial and JavaScript
DeNA Technology Seminar #3 - OpenSocial and JavaScriptDeNA Technology Seminar #3 - OpenSocial and JavaScript
DeNA Technology Seminar #3 - OpenSocial and JavaScript
 
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...
Memulai Karir menjadi iOS Developer - Gilang ramadhan (Academy Content Writer...
 
MobSecCon 2015 - Dynamic Analysis of Android Apps
MobSecCon 2015 - Dynamic Analysis of Android AppsMobSecCon 2015 - Dynamic Analysis of Android Apps
MobSecCon 2015 - Dynamic Analysis of Android Apps
 
Seeding a Tree in a Gherkin
Seeding a Tree in a GherkinSeeding a Tree in a Gherkin
Seeding a Tree in a Gherkin
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An Overview
 
The path to cdi 2.0
The path to cdi 2.0The path to cdi 2.0
The path to cdi 2.0
 
Barcode scanning on Android
Barcode scanning on AndroidBarcode scanning on Android
Barcode scanning on Android
 
Clean architecture on android
Clean architecture on androidClean architecture on android
Clean architecture on android
 
Static Analysis For Security and DevOps Happiness w/ Justin Collins
Static Analysis For Security and DevOps Happiness w/ Justin CollinsStatic Analysis For Security and DevOps Happiness w/ Justin Collins
Static Analysis For Security and DevOps Happiness w/ Justin Collins
 
Micro Frontends
Micro FrontendsMicro Frontends
Micro Frontends
 
Django
DjangoDjango
Django
 
Adopt a JSR: CDI 2.0 at Devoxx UK
Adopt a JSR: CDI 2.0 at Devoxx UKAdopt a JSR: CDI 2.0 at Devoxx UK
Adopt a JSR: CDI 2.0 at Devoxx UK
 

En vedette

Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2Infinum
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsGlobalLogic Ukraine
 
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan Kust
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan KustAndroid Meetup Slovenija #3 - Testing with Robolectric by Ivan Kust
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan KustInfinum
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionStfalcon Meetups
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMFabio Collini
 
Android with dagger_2
Android with dagger_2Android with dagger_2
Android with dagger_2Kros Huang
 

En vedette (7)

Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
 
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan Kust
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan KustAndroid Meetup Slovenija #3 - Testing with Robolectric by Ivan Kust
Android Meetup Slovenija #3 - Testing with Robolectric by Ivan Kust
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVM
 
Android with dagger_2
Android with dagger_2Android with dagger_2
Android with dagger_2
 
Building maintainable app
Building maintainable appBuilding maintainable app
Building maintainable app
 

Similaire à Moderne App-Architektur mit Dagger2 und RxJava

Play Support in Cloud Foundry
Play Support in Cloud FoundryPlay Support in Cloud Foundry
Play Support in Cloud Foundryrajdeep
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugToshiaki Maki
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsEffie Arditi
 
To Microservices and Beyond
To Microservices and BeyondTo Microservices and Beyond
To Microservices and BeyondMatt Stine
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyMark Proctor
 
Spring boot
Spring bootSpring boot
Spring bootsdeeg
 
Wordcamp Toronto Presentation
Wordcamp Toronto PresentationWordcamp Toronto Presentation
Wordcamp Toronto PresentationRoy Sivan
 
AngularJS for Web and Mobile
 AngularJS for Web and Mobile AngularJS for Web and Mobile
AngularJS for Web and MobileRocket Software
 
2011 - DNC: REST Wars
2011 - DNC: REST Wars2011 - DNC: REST Wars
2011 - DNC: REST WarsDaniel Fisher
 
Swift at IBM: Mobile, open source and the drive to the cloud
Swift at IBM: Mobile, open source and the drive to the cloudSwift at IBM: Mobile, open source and the drive to the cloud
Swift at IBM: Mobile, open source and the drive to the cloudDev_Events
 
Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Lars Vogel
 
Onion Architecture with S#arp
Onion Architecture with S#arpOnion Architecture with S#arp
Onion Architecture with S#arpGary Pedretti
 
Re-architecting the designer-developer workflow
Re-architecting the designer-developer workflowRe-architecting the designer-developer workflow
Re-architecting the designer-developer workflowRichard Lord
 
Clean Architecture on Android
Clean Architecture on AndroidClean Architecture on Android
Clean Architecture on AndroidTianming Xu
 
Developing maintainable Cordova applications
Developing maintainable Cordova applicationsDeveloping maintainable Cordova applications
Developing maintainable Cordova applicationsIvano Malavolta
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributesMarco Eidinger
 
Micro front ends
Micro front endsMicro front ends
Micro front endsWaqasAli383
 
Enabling .NET Apps with Monitoring and Management Using Steeltoe
Enabling .NET Apps with Monitoring and Management Using SteeltoeEnabling .NET Apps with Monitoring and Management Using Steeltoe
Enabling .NET Apps with Monitoring and Management Using SteeltoeVMware Tanzu
 

Similaire à Moderne App-Architektur mit Dagger2 und RxJava (20)

Play Support in Cloud Foundry
Play Support in Cloud FoundryPlay Support in Cloud Foundry
Play Support in Cloud Foundry
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi Applications
 
To Microservices and Beyond
To Microservices and BeyondTo Microservices and Beyond
To Microservices and Beyond
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
 
Spring boot
Spring bootSpring boot
Spring boot
 
Wordcamp Toronto Presentation
Wordcamp Toronto PresentationWordcamp Toronto Presentation
Wordcamp Toronto Presentation
 
AngularJS for Web and Mobile
 AngularJS for Web and Mobile AngularJS for Web and Mobile
AngularJS for Web and Mobile
 
2011 - DNC: REST Wars
2011 - DNC: REST Wars2011 - DNC: REST Wars
2011 - DNC: REST Wars
 
Swift at IBM: Mobile, open source and the drive to the cloud
Swift at IBM: Mobile, open source and the drive to the cloudSwift at IBM: Mobile, open source and the drive to the cloud
Swift at IBM: Mobile, open source and the drive to the cloud
 
Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010Eclipse 40 - Eclipse Summit Europe 2010
Eclipse 40 - Eclipse Summit Europe 2010
 
Onion Architecture with S#arp
Onion Architecture with S#arpOnion Architecture with S#arp
Onion Architecture with S#arp
 
Re-architecting the designer-developer workflow
Re-architecting the designer-developer workflowRe-architecting the designer-developer workflow
Re-architecting the designer-developer workflow
 
Clean Architecture on Android
Clean Architecture on AndroidClean Architecture on Android
Clean Architecture on Android
 
JAX 08 - Agile RCP
JAX 08 - Agile RCPJAX 08 - Agile RCP
JAX 08 - Agile RCP
 
Developing maintainable Cordova applications
Developing maintainable Cordova applicationsDeveloping maintainable Cordova applications
Developing maintainable Cordova applications
 
Diving Into Xamarin.Forms
Diving Into Xamarin.Forms Diving Into Xamarin.Forms
Diving Into Xamarin.Forms
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributes
 
Micro front ends
Micro front endsMicro front ends
Micro front ends
 
Enabling .NET Apps with Monitoring and Management Using Steeltoe
Enabling .NET Apps with Monitoring and Management Using SteeltoeEnabling .NET Apps with Monitoring and Management Using Steeltoe
Enabling .NET Apps with Monitoring and Management Using Steeltoe
 

Plus de inovex GmbH

lldb – Debugger auf Abwegen
lldb – Debugger auf Abwegenlldb – Debugger auf Abwegen
lldb – Debugger auf Abwegeninovex GmbH
 
Are you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIAre you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIinovex GmbH
 
Why natural language is next step in the AI evolution
Why natural language is next step in the AI evolutionWhy natural language is next step in the AI evolution
Why natural language is next step in the AI evolutioninovex GmbH
 
Network Policies
Network PoliciesNetwork Policies
Network Policiesinovex GmbH
 
Interpretable Machine Learning
Interpretable Machine LearningInterpretable Machine Learning
Interpretable Machine Learninginovex GmbH
 
Jenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen UmgebungenJenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen Umgebungeninovex GmbH
 
AI auf Edge-Geraeten
AI auf Edge-GeraetenAI auf Edge-Geraeten
AI auf Edge-Geraeteninovex GmbH
 
Prometheus on Kubernetes
Prometheus on KubernetesPrometheus on Kubernetes
Prometheus on Kubernetesinovex GmbH
 
Deep Learning for Recommender Systems
Deep Learning for Recommender SystemsDeep Learning for Recommender Systems
Deep Learning for Recommender Systemsinovex GmbH
 
Representation Learning von Zeitreihen
Representation Learning von ZeitreihenRepresentation Learning von Zeitreihen
Representation Learning von Zeitreiheninovex GmbH
 
Talk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale AssistentenTalk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale Assistenteninovex GmbH
 
Künstlich intelligent?
Künstlich intelligent?Künstlich intelligent?
Künstlich intelligent?inovex GmbH
 
Das Android Open Source Project
Das Android Open Source ProjectDas Android Open Source Project
Das Android Open Source Projectinovex GmbH
 
Machine Learning Interpretability
Machine Learning InterpretabilityMachine Learning Interpretability
Machine Learning Interpretabilityinovex GmbH
 
Performance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use casePerformance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use caseinovex GmbH
 
People & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessPeople & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessinovex GmbH
 
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with PulumiInfrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with Pulumiinovex GmbH
 

Plus de inovex GmbH (20)

lldb – Debugger auf Abwegen
lldb – Debugger auf Abwegenlldb – Debugger auf Abwegen
lldb – Debugger auf Abwegen
 
Are you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIAre you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AI
 
Why natural language is next step in the AI evolution
Why natural language is next step in the AI evolutionWhy natural language is next step in the AI evolution
Why natural language is next step in the AI evolution
 
WWDC 2019 Recap
WWDC 2019 RecapWWDC 2019 Recap
WWDC 2019 Recap
 
Network Policies
Network PoliciesNetwork Policies
Network Policies
 
Interpretable Machine Learning
Interpretable Machine LearningInterpretable Machine Learning
Interpretable Machine Learning
 
Jenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen UmgebungenJenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen Umgebungen
 
AI auf Edge-Geraeten
AI auf Edge-GeraetenAI auf Edge-Geraeten
AI auf Edge-Geraeten
 
Prometheus on Kubernetes
Prometheus on KubernetesPrometheus on Kubernetes
Prometheus on Kubernetes
 
Deep Learning for Recommender Systems
Deep Learning for Recommender SystemsDeep Learning for Recommender Systems
Deep Learning for Recommender Systems
 
Azure IoT Edge
Azure IoT EdgeAzure IoT Edge
Azure IoT Edge
 
Representation Learning von Zeitreihen
Representation Learning von ZeitreihenRepresentation Learning von Zeitreihen
Representation Learning von Zeitreihen
 
Talk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale AssistentenTalk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale Assistenten
 
Künstlich intelligent?
Künstlich intelligent?Künstlich intelligent?
Künstlich intelligent?
 
Dev + Ops = Go
Dev + Ops = GoDev + Ops = Go
Dev + Ops = Go
 
Das Android Open Source Project
Das Android Open Source ProjectDas Android Open Source Project
Das Android Open Source Project
 
Machine Learning Interpretability
Machine Learning InterpretabilityMachine Learning Interpretability
Machine Learning Interpretability
 
Performance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use casePerformance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use case
 
People & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessPeople & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madness
 
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with PulumiInfrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
 

Dernier

Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROmotivationalword821
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 

Dernier (20)

Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTRO
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 

Moderne App-Architektur mit Dagger2 und RxJava