Mais conteúdo relacionado
Semelhante a Droidcon ES '16 - How to fail going offline (20)
Droidcon ES '16 - How to fail going offline
- 29. PostActivity:init
private PostRepository mRepository;
private Executor mExecutor;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRepository = DemosApplication.instance()
.demoSdk()
.postRepository();
mExecutor = Executors.newSingleThreadExecutor();
startLoading();
PostLoader.init(getSupportLoaderManager(), this);
}
Views
- 30. PostActivity:loaddata
@Override
public Loader<List<Post>> onCreateLoader(int id, Bundle args) {
return new PostLoader(this, DemosApplication.instance().demoSdk());
}
@Override
public void onLoadFinished(Loader<List<Post>> loader, List<Post> data) {
stopLoading();
setAdapter(data);
}
@Override
public void onLoaderReset(@NonNull Loader<List<Post>> loader) {
//Do nothing
}
Views
- 34. postloader
@Override
public List<Post> loadInBackground() {
setData(mDemoSdk.postRepository().posts());
return getData();
}
@Override
public void registerListener() {
if (mObserver == null) {
mObserver = SyncService.listenForUpdates(this);
}
}
@Override
public void unregisterListener() {
if (mObserver != null) {
SyncService.removeUpdateListener(this, mObserver);
}
}
loader
- 36. Postrepository:Save
@WorkerThread
public void localCreate(@NonNull Post post) {
mPostDao.save(post);
SyncService.triggerSync(mContext);
}
@WorkerThread
public void remoteCreate(@NonNull Post post) {
Response<Post> postResponse = mPostService.create(Post.builder(post)
.internalId(null)
.needsSync(false)
.build()).execute();
if (postResponse.isSuccessful()) {
mPostDao.save(Post.builder(postResponse.body())
.internalId(post.internalId())
.build());
}
}
datasource
- 37. Postrepository:DELETE
@WorkerThread
public void localDelete(@NonNull Post post) {
long now = new Date().getTime();
if (post.isNew() && post.isStoredLocally()) {
mPostDao.delete(post.internalId());
SyncService.notifyChange(mContext);
} else {
mPostDao.save(Post.builder(post)
.deletedAt(now)
.updatedAt(now)
.needsSync(true).build());
SyncService.triggerSync(mContext);
}
}
@WorkerThread
public void remoteDelete(@NonNull Post post) {
if (mPostService.deletePost(post.id()).execute().isSuccessful() && post.isStoredLocally()) {
for (Comment comment : mCommentDao.comments(post.internalId())) {
remoteDelete(comment);
}
mPostDao.delete(post.internalId());
}
}
datasource
- 38. Syncservice:trigger
public static void triggerSync(@NonNull Context context) {
SyncService.notifyChange(context);
ComponentName component = new ComponentName(context, SyncService.class);
JobInfo info = new JobInfo.Builder(SYNC_SERVICE_ID, component)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
getScheduler(context).schedule(info);
}
sync
- 39. Syncservice:Listenforupdates
public static BroadcastReceiver listenForUpdates(@NonNull Loader loader) {
IntentFilter filter = new IntentFilter(CHANGE_SYNC_INTENT_ACTION);
SyncServiceReceiver receiver = new SyncServiceReceiver(loader);
LocalBroadcastManager.getInstance(loader.getContext())
.registerReceiver(receiver, filter);
return receiver;
}
public static void removeUpdateListener(@NonNull Loader loader,
@NonNull BroadcastReceiver observer) {
LocalBroadcastManager.getInstance(loader.getContext())
.unregisterReceiver(observer);
}
public static void notifyChange(@NonNull Context context) {
LocalBroadcastManager.getInstance(context).sendBroadcast(getCompletionIntent());
}
sync
- 40. Syncservice:DotheJOB
@Override
public boolean onStartJob(JobParameters params) {
DemoSdk sdk = DemoSdk.Factory.instance();
boolean willExecute = true;
if (sdk != null) {
mRunningSyncTask = new SynchronizeTask(sdk, this);
mRunningSyncTask.execute(params);
} else {
willExecute = false;
}
return willExecute;
}
sync
@Override
public boolean onStopJob(JobParameters params) {
boolean reschedule = false;
if (mRunningSyncTask != null) {
mRunningSyncTask.cancel(true);
reschedule = true;
}
return reschedule;
}
- 41. Synctask:Sync
@Override
protected JobParameters doInBackground(JobParameters... params) {
syncPosts();
syncComments();
return params[0];
}
sync
private void syncPosts() {
List<Post> posts = mSdk.postRepository().localPendingPosts();
for (Post post : posts) {
if (post.isNew()) {
mSdk.postRepository().remoteCreate(post);
} else if (post.isDeleted()) {
mSdk.postRepository().remoteDelete(post);
}
}
}