网站域名备案证书,网页素材大宝库,网站免费模板,seo的全称是什么项目需求#xff1a;展示欢迎页的同时执行token登录和首页预加载背景#xff1a;在此之前#xff0c;展示欢迎页和token登录等网络操作是串行的#xff0c;所以用户点开App到最终看到首页的时间就是#xff1a;展示欢迎页的时间登录时间请求…项目需求展示欢迎页的同时执行token登录和首页预加载背景在此之前展示欢迎页和token登录等网络操作是串行的所以用户点开App到最终看到首页的时间就是展示欢迎页的时间登录时间请求首页数据时间。单线程处理这些事情的优点是逻辑清晰控制简单。缺点也非常突出用户的体验并不好特别是网络状况不佳的时候等待时间大幅增加。这个版本我们加入了跳过功能对于等待时间的要求更高了我不得不“磨刀霍霍”着手解决这个问题。场景欢迎页可能执行的网络操作检查版本更新、token登录、预加载首页数据(两个接口)如果本地保存有用户的登录信息执行token登录如果本地未保存用户的登录信息跳转到登录页如果出现网络连接错误(断网、超时等)直接提示用户网络错误退出软件如果需要强制更新跳转到登录页进行更新token登录失败跳转到登录页全部接口请求完成(仅指token登录成功)携带数据启动首页。思路展示欢迎页的同时启动所有网络请求使用AtomicInteger计数使用AtomicBoolean标记关键事件(是否达到展示时间、是否发生网络错误、是否需要跳转到登录页)每个网络操作完成时要及时更新计数器如果发生“关心”事件要进行登记每个网络操作完成时都要进行终点测试(判断自己是否是最后完成者是的话就要执行跳转)。关键代码网络请求样例VersionModelImpl.CheckVersionListener listener new VersionModelImpl.CheckVersionListener() {Overridepublic void onSuccess(JSONObject data) {try {final Version version new Gson().fromJson(data.toString(), Version.class);if (isMustUpdate(version)) {mNeedLogin.set(true);//登记状态}isCheckVersionSuccess true;// 记录检查版本的结果mStepsAtomicInteger.getAndIncrement();// 计数finalTest();//终点测试} catch (Exception e) {e.printStackTrace();mNeedLogin.set(true);mStepsAtomicInteger.getAndIncrement();finalTest();}}Overridepublic void onFailure(String code, String message) {mIsNetworkError.set(true);// 登记网络错误mStepsAtomicInteger.getAndIncrement();finalTest();}};终点测试方法//终点测试判断预加载是否都完成private synchronized void finalTest() {if (!mAllowFinalTestAtomicBoolean.get()) {//时间是否满足return;}if(mIsNetworkError.get()){//如果网络错误try {final Dialog dialog confirm(网络信号不好哟~宝宝卡得要哭了~);dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {Overridepublic void onDismiss(DialogInterface dialog) {onBackPressed();}});} catch (Exception e) {e.printStackTrace();}return;}if (mNeedLogin.get()) {//如果需要登录LoginActivity.enterLogin(PictureActivity.this);return;}if (mStepsAtomicInteger.intValue() 4) {//所有网络请求都已返回if (isCheckVersionSuccess isLoginByTokenSuccess) {enterMainActivity();} else {LoginActivity.enterLogin(PictureActivity.this);}}}