mobgen - android session mvp & rx
TRANSCRIPT
Friday minutes
MVPRxJava
Javier de PedroXes García
MVP
Xes García
Best practices - MVP
MVP vs MVC
Who is who?
ActivityFragmentCustom Android View
New layer
ExampleRequirements
- Close advertise after 3 secs- Close advertise when button
pressed- Go to activity when pressed
inside- Load ad from CMS
Model
public class Interstitial implements Parcelable {
private String mTitle; private String mImage; private String mHref;
}
View - Class
public class InterstitialActivity extends BaseActivity implements InterstitialViewTranslator {private NetworkImageView mInterstitialImage;private View mLoader;private InterstitialPresenter mPresenter;
}
View - OnCreate@Overridepublic void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_intersitital);
mInterstitialImage = (NetworkImageView) findViewById(R.id.interstitial_image);
mLoader = findViewById(R.id.loader);View closeButton = findViewById(R.id.interstitial_close);
closeButton.setOnClickListener(this);
mPresenter = new InterstitialPresenter(this, this);}
View - OnClick@Overridepublic void onClick (View v) {
switch (v.getId()){case R.id.interstitial_close:
mPresenter.close();break;
case R.id.interstitial_image:mPresenter.goToInterstitial();break;
}}
View Translator interfacepublic interface InterstitialViewTranslator {
void startLoading();void stopLoading();void openNextActivity()void showInterstitial(Interstitial interstitial);
}
View - Implementation@Overridepublic void startLoading () {
mLoader.setVisibility(View.VISIBLE);}
@Overridepublic void stopLoading () {
mLoader.setVisibility(View.GONE);}
@Overridepublic void openNextActivity () {
Intent intent = new Intent(this, AnotherActivity.class);}
@Overridepublic void showInterstitial (Interstitial interstitial) {
if(interstitial != null) {mInterstitialImage.setImageUrl(interstitial.getImage(), VolleyUtil.getImageLoader());mInterstitialImage.setOnClickListener(this);
}}
Presenter - Classpublic class InterstitialPresenter extends BasePresenter {
private InterstitialViewTranslator mViewTranslator;private CloseRunnable mCloseRunnable;private Handler mHandler;
}
Presenter - Constructorpublic InterstitialPresenter(InterstitialViewTranslator viewTranslator){
mViewTranslator = viewTranslator;if(mViewTranslator == null){
throw new NullPointerException("The presenter must have a view translator instance."
);}mHandler = new Handler();restoreState(); // Loads a state if present to keep the timeloadInterstitial();}
Presenter - Actionsprivate void loadInterstitial (){
mViewTranslator.startLoading();InterstitialWebService.fetchInterstitial(new IBackgroundTaskCallback<Interstitial>() {
@Overridepublic void onCompleted (CustomException e, Interstitial interstitial) {
TotoLog.d("Interstitial loaded");mViewTranslator.stopLoading();if (interstitial != null) {
onLoadInterstitial(interstitial);} else {
close();}
}});
}private void onLoadInterstitial(Interstitial interstitial){
mViewTranslator.showInterstitial(interstitial);startTimer();
}
View - Show ad@Overridepublic void showInterstitial (Interstitial interstitial) {
if(interstitial != null) {mInterstitialImage.setImageUrl(interstitial.getImage(),
VolleyUtil.getImageLoader());mInterstitialImage.setOnClickListener(this);
}}
Presenter - Last stepspublic void pause () {
cancelTimerCallback();saveState();
}
public void destroy(){cancelTimerCallback();
}
Testing
Testing environment(mocks)
Presenter
Testing environment(mocks)
Activity/View/Fragment(lifecycle)(view methods)
Services
Web Service
RxJava
Javier de Pedro
RxJava -
In Android… YES (Started on April 2013)
(Android Weekly)
RxJava - What?
BORNDeprecating the observer patternMicrosoft first library
GOOD FOR- Data management- Stream read- Event handling- Thread sync- Standard across languages
NOT SO GOOD FOR:- Sync programming- Noobies
RxJava - ObservableSpecial Observer pattern
ObservableClientdata retrieval
posibility condition
Call to network
Go to database
Use a list
Read file
Awful nameAsynchronous iterator
subscribe
observe
RxJava - Ex. ObservableObservable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> observer) { try { if (!observer.isUnsubscribed()) { for (int i = 1; i < 5; i++) { observer.onNext(i); } observer.onCompleted(); } } catch (Exception e) { observer.onError(e); } }
RxJava - OperationsCreate
FlatMap
Filter
BufferToSortedList
GroopBy
...
RxJava - Ex. SubscriptioncityWebService.getCapitals() .flatMap(cityList -> Observable.from(cityList)) .filter(city -> city.getPopulation() > 500,000) .flatMap(city -> weatherService.getCurrentWeather(city)) // Runs requests in paralell .toSortedList((cw1,cw2) -> cw1.getCityName().compare(cw2.getCityName()));
GistsPresenter minimal example
https://gist.github.com/butelo/76b360003c13955072fd
RxJava minimal example...