Mobgen - Android session MVP & Rx
-
Upload
javier-de-pedro-lopez -
Category
Software
-
view
128 -
download
0
Transcript of Mobgen - Android session MVP & Rx
![Page 1: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/1.jpg)
Friday minutes
MVPRxJava
Javier de PedroXes García
![Page 2: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/2.jpg)
MVP
Xes García
![Page 3: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/3.jpg)
Best practices - MVP
![Page 4: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/4.jpg)
MVP vs MVC
![Page 5: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/5.jpg)
Who is who?
ActivityFragmentCustom Android View
New layer
![Page 6: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/6.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/7.jpg)
Model
public class Interstitial implements Parcelable {
private String mTitle; private String mImage; private String mHref;
}
![Page 8: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/8.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/9.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/10.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/11.jpg)
View Translator interfacepublic interface InterstitialViewTranslator {
void startLoading();void stopLoading();void openNextActivity()void showInterstitial(Interstitial interstitial);
}
![Page 12: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/12.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/13.jpg)
Presenter - Classpublic class InterstitialPresenter extends BasePresenter {
private InterstitialViewTranslator mViewTranslator;private CloseRunnable mCloseRunnable;private Handler mHandler;
}
![Page 14: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/14.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/15.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/16.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/17.jpg)
Presenter - Last stepspublic void pause () {
cancelTimerCallback();saveState();
}
public void destroy(){cancelTimerCallback();
}
![Page 18: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/18.jpg)
Testing
Testing environment(mocks)
Presenter
Testing environment(mocks)
Activity/View/Fragment(lifecycle)(view methods)
Services
Web Service
![Page 19: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/19.jpg)
RxJava
Javier de Pedro
![Page 20: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/20.jpg)
RxJava -
In Android… YES (Started on April 2013)
(Android Weekly)
![Page 21: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/21.jpg)
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 23: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/23.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/24.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/25.jpg)
RxJava - OperationsCreate
FlatMap
Filter
BufferToSortedList
GroopBy
...
![Page 26: Mobgen - Android session MVP & Rx](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/26.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062822/587c17291a28abb5068b4807/html5/thumbnails/27.jpg)
GistsPresenter minimal example
https://gist.github.com/butelo/76b360003c13955072fd
RxJava minimal example...