mobgen - android session mvp & rx

27
Friday minutes MVP RxJava Javier de Pedro Xes García

Upload: javier-de-pedro-lopez

Post on 16-Jan-2017

131 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Mobgen - Android session MVP & Rx

Friday minutes

MVPRxJava

Javier de PedroXes García

Page 2: Mobgen - Android session MVP & Rx

MVP

Xes García

Page 3: Mobgen - Android session MVP & Rx

Best practices - MVP

Page 4: Mobgen - Android session MVP & Rx

MVP vs MVC

Page 5: Mobgen - Android session MVP & Rx

Who is who?

ActivityFragmentCustom Android View

New layer

Page 6: Mobgen - Android session MVP & Rx

ExampleRequirements

- Close advertise after 3 secs- Close advertise when button

pressed- Go to activity when pressed

inside- Load ad from CMS

Page 7: Mobgen - Android session MVP & Rx

Model

public class Interstitial implements Parcelable {

private String mTitle; private String mImage; private String mHref;

}

Page 8: Mobgen - Android session MVP & Rx

View - Class

public class InterstitialActivity extends BaseActivity implements InterstitialViewTranslator {private NetworkImageView mInterstitialImage;private View mLoader;private InterstitialPresenter mPresenter;

}

Page 9: Mobgen - Android session MVP & Rx

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);}

Page 10: Mobgen - Android session MVP & Rx

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;

}}

Page 11: Mobgen - Android session MVP & Rx

View Translator interfacepublic interface InterstitialViewTranslator {

void startLoading();void stopLoading();void openNextActivity()void showInterstitial(Interstitial interstitial);

}

Page 12: Mobgen - Android session MVP & Rx

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);

}}

Page 13: Mobgen - Android session MVP & Rx

Presenter - Classpublic class InterstitialPresenter extends BasePresenter {

private InterstitialViewTranslator mViewTranslator;private CloseRunnable mCloseRunnable;private Handler mHandler;

}

Page 14: Mobgen - Android session MVP & Rx

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();}

Page 15: Mobgen - Android session MVP & Rx

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();

}

Page 16: Mobgen - Android session MVP & Rx

View - Show ad@Overridepublic void showInterstitial (Interstitial interstitial) {

if(interstitial != null) {mInterstitialImage.setImageUrl(interstitial.getImage(),

VolleyUtil.getImageLoader());mInterstitialImage.setOnClickListener(this);

}}

Page 17: Mobgen - Android session MVP & Rx

Presenter - Last stepspublic void pause () {

cancelTimerCallback();saveState();

}

public void destroy(){cancelTimerCallback();

}

Page 18: Mobgen - Android session MVP & Rx

Testing

Testing environment(mocks)

Presenter

Testing environment(mocks)

Activity/View/Fragment(lifecycle)(view methods)

Services

Web Service

Page 19: Mobgen - Android session MVP & Rx

RxJava

Javier de Pedro

Page 20: Mobgen - Android session MVP & Rx

RxJava -

In Android… YES (Started on April 2013)

(Android Weekly)

Page 21: Mobgen - Android session MVP & Rx

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

Page 22: Mobgen - Android session MVP & Rx

RxJava - PhilosophyEverything is a Stream of data

http://reactivex.io/

Page 23: Mobgen - Android session MVP & Rx

RxJava - ObservableSpecial Observer pattern

ObservableClientdata retrieval

posibility condition

Call to network

Go to database

Use a list

Read file

Awful nameAsynchronous iterator

subscribe

observe

Page 24: Mobgen - Android session MVP & Rx

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); } }

Page 25: Mobgen - Android session MVP & Rx

RxJava - OperationsCreate

FlatMap

Filter

BufferToSortedList

GroopBy

...

Page 26: Mobgen - Android session MVP & Rx

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()));

Page 27: Mobgen - Android session MVP & Rx

GistsPresenter minimal example

https://gist.github.com/butelo/76b360003c13955072fd

RxJava minimal example...