Post on 17-Jul-2015
Learn, learn, learn!
Get rid of non-UI logic on UI
Avoid memory leaking
Centralized cache & readiness
/** Created by sefford on 9/06/13. */
public abstract class MovieitBaseRequest<T> extends Request<T> {
public MovieitBaseRequest(int method, String url, HashMap<String, String> parameters, BusManager bus, boolean hasToCache) { /* … */ }
public MovieitBaseRequest(int method, String url, BusManager bus, boolean hasToCache){ /* … */ }
private static String generateParametersString(HashMap<String, String> parameters) { /* … */ }
private static Map<String, String> initializeHeaders() { /* … */ }
@Override public Map<String, String> getHeaders() throws AuthFailureError { /* … */ }
@Override protected Response<T> parseNetworkResponse(NetworkResponse response) { return processResponse(response.getBody()); }
@Override protected void deliverResponse(T response) { bus.post(response); }
@Override public void deliverError(VolleyError error) { bus.post(error); }
public T processResponse(String json) {
T content = processJSon(json);
content = postProcess(content);
if (hasToCache) {
saveToCache(content);
}
return content;
}
protected abstract T processJSon(String json);
protected T postProcess(T content) { /* … */ }
protected abstract void saveToCache(T object);
}
Retrieval
Postprocess
Save to cache
Notify
Fetch the data (network, disk, system...)
Chance to operate through the data (sort, filter, sync…)
Persist the data on cache (d’oh)
Notify sucessful or failure completion
public abstract class Interactor<R extends ResponseInterface, E extends ErrorInterface> implements Runnable, InteractorNotification<R, E> {
// Postable interface allows us to hide callbacks, but we use a bus
protected Interactor(Postable postable, Loggable log, InteractorIdentification delegate) {
this.postable = postable;
this.log = log;
this.delegate = delegate;
}
@Override
public void notifySuccess(R content) {
postable.post(content);
}
}
public class StandardNetworkInteractor<R extends ResponseInterface, E extends ErrorInterface> extends NetworkInteractor<R, E> {
// NetworkInteractor defines the way to notify an error@Overridepublic void run() {
try {final R content = ((NetworkDelegate<R, E>) delegate).retrieveNetworkResponse();final R processedContent = ((NetworkDelegate<R, E>) delegate).postProcess(content);
((NetworkDelegate<R, E>) delegate).saveToCache(processedContent);notifySuccess(processedContent);
} catch (Exception x) { // Pokemon exception, but the delegate handles the correct responsenotifyError(((NetworkDelegate<R, E>) delegate).composeErrorResponse(x));
}}
}
public interface NetworkDelegate<R extends ResponseInterface, E extends ErrorInterface> extends InteractorIdentification {
R retrieveNetworkResponse() throws Exception;
R postProcess(R content);
void saveToCache(R object);
E composeErrorResponse(Exception error);}
Repository<K , V>
BaseRepo<K , V>
ImplementsCurrent Repo Level Next Repo Level
Chain of Responsibility
+
Decorator
CRUD Interface
Hierarchial multi-level Repositories (BaseRepository)
Java Map Repositories
Android LRU Repositories (Android)
DiskLRUCache Repositories
Realm Repositories (Android)
ADA Framework Repositories
Layout files
Application
Activities
Fragments
Views
Int1 Int2Int
NInt3 ...
Bus
RepositoriesModel &
Data
Presentation
Android UI Lifecycle
Facade
Presenter Presenter
Outside our happy world
Cushioning & Coordination
Handles view state
Fragment
HoloFacade LollipopFacadeHoloTabletsFacade
FragmentFacadeInterface
HoloPresenter1 HoloPresenter2 TabPresenterLolliPresenter
1
LolliPresenter
2
HoloPresenter 1 & LolliPresenter 1 implement PresenterInterface1, same with 2
HoloTabletsFacade likely to be composed of a HoloFacade
MainActivity
Flow
Control
Intent
Dispatching
Routing
Push
Services
AnalyticsNFC
ActionBar
Control
Menu
Control
StatusBar
Control
Session
MgmtLogging ...
Independent of Frameworks
Testable
Independent of UI
Independent of Database
Independent of Outside World
Repo: http://github.com/Sefford/kor
Gradle: compile 'com.sefford:kor-common:2.0'
compile 'com.sefford:kor-retrofit:1.1'
compile 'com.sefford:kor-android:1.0.2@aar'
Sample (WIP, Untested, Undocumented >_<U): https://github.com/Sefford/Kor-Sample
Forks & PRs are welcome <3