tiCourse
CourseCourseManager.getInstance().getCurrCourseId();tiCourseCetTypeLogic.getCetType()courseSetPrefix 对应 yy46j 通过 Const.CET 来索取tiCourse 对应 yy4j 或者 yy6j
连接四六级数据库命令
mysql -h10.51.101.246 -p3306 -uenglish -p'English!@#' ape_englishshow databases;use ape_english;
怎么屏蔽掉一个 router
com.fenbi.android.yingyu.router.MemberRightsPage@Route(value = {"/member/rights", "/{coursePrefix}/member/center", "/{coursePrefix2}/member", "/member/center"}, priority = 1)public class MemberRightsPage implements IRouting {// com.fenbi.android.module.vip.rights.MemberRightsActivity@Overridepublic boolean routing(Context context, Page page, Callback callback) {// Cet has no vip logicreturn true;}}
取 Exception
Throwable
debugParams.put("exception", ExceptionUtils.dump(e));
多文件上传
com.fenbi.android.cet.camera.CameraApi#doUpload
intent 取数据
打印所有参数URLDecoder.decode(getIntent().toUri(0))LogUtils.e(URLDecoder.decode(getIntent().toUri(0)));获取 routergetIntent().getStringExtra(Const.KEY_ROUTER_PATH);@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);if (intent != null) {tiCourse = intent.getStringExtra("tiCourse");// 必须先转成字符串tagId = Integer.parseInt(intent.getStringExtra("tagId"));tagName = intent.getStringExtra("tagName");}renderEntranceParams();recyclerView.scrollTo(0, 0);cetRefreshView.autoRefresh();}
页面参数
页面参数com.fenbi.android.business.cet.common.utils.CetPageUtil
复制到剪切板
com.fenbi.android.module.yingyu.mkds.home.MkdsHomepageActivity#putTextIntoClip
用户昵称
// com.fenbi.android.module.yingyu.training_camp.home.CampUtils#getUserAccountNamepublic static String getUserAccountName() {String nickName = UserLogic.getInstance().getNickName();if (StringUtils.isEmpty(nickName)) {return UserLogic.getInstance().getUserAccount();}return nickName;}
用户头像.短地址
public static String getNormalImageUrl(String image) {if (!TextUtils.isEmpty(image) && image.startsWith("http")) {return image;}return String.format(Locale.getDefault(), "%s/api/images/%s?width=%d&height=%d", KeApiUrl.getCdnRootUrl(), image, NORMAL_SIZE, NORMAL_SIZE);}
时间格式化
com.fenbi.android.yingyu.home.home.adapter.CetHomeHeaderHolder#renderAppClockIncom.fenbi.android.yingyu.appsign.AppSignUtil#chartYPopTextcom.fenbi.android.yingyu.appsign.learndata.LearnDataActivity#getWatchLectureDurationFormat每天零时零秒com.fenbi.android.ke.util.TimeUtils#getDayStart
数据转换
@NonNullpublic static long[] toArray(@Nullable List<Long> list) {if (ObjectUtils.isEmpty(list)) {return new long[0];}long[] result = new long[list.size()];for (int i = 0; i < result.length; i++) {result[i] = list.get(i);}return result;}@NonNullpublic static List<Long> toList(@Nullable long[] array) {if (ObjectUtils.isEmpty(array)) {return new ArrayList<>();}List<Long> list = new ArrayList<>();for (long num : array) {list.add(num);}return list;}
线上日志调试
implementation project(':lib:log-catcher')Map<String, String> params = new HashMap<>();params.put("isDestroyed", String.valueOf(isDestroyed()));params.put("viewName", "lectureBg");DebugLogger.getInstance().log("destroyed_activity", params, "");// 重新登录问题// * and __topic__ : Login_Fatal and uid: 83383113DebugLogger.getInstance().log("Login_Fatal", params, "");
数据精确度
四舍五入, 保留小数点后几位String.format(Locale.getDefault(), "%.0f%%", 100 * data.getRightRatio());String.format(Locale.getDefault(), "%.0f%%", 100 * data.getWinRate());全舍String.format(Locale.getDefault(), "%d%%", (int)(100 * data.getRightRatio()));格式化数字 万 Wcom.fenbi.android.business.cet.common.utils.RecommendUtil#formatCount
报时器
报时器, 每隔几秒回调一次, 除非主动取消
com.fenbi.android.business.cet.common.logic.TimerLogic
倒计时
com.fenbi.android.business.cet.common.logic.CountDownLogic
失败重试
Observable<RunningStatus> statusObservable = RetrofitUtils.getInstance().getApi(Api.getPath(coursePrefix), Api.class).mkdsStatusInfo(String.valueOf(jamId)).retryWhen(new RetryWhenFunction<>(5, new RunningStatus()));
播放本地视频
com.fenbi.android.module.yingyu.training_camp.summary.adapter.LockableStepViewHolder#playSoundEffectplayer.setDateResource("rawresource:///" + R.raw.camp_step_open);
关掉 Native debugger


截图拼接二维码

com.fenbi.android.cet.exercise.history.screenshot.ScreenShotViewModel#concatBitmap
不需要挂在 view 树上
child.measure(View.MeasureSpec.makeMeasureSpec(ScreenUtils.getScreenWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.UNSPECIFIED);child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());Bitmap shotBitmap = PrayDrawShotUtil.shot(shareBinding.bodyView);doShare(consumer, shotBitmap, path, share, null);
截图分享
SD 卡, 存储位置 “/storage/emulated/0/Download/1653969479078.jpg”
com.fenbi.android.cet.exercise.history.screenshot.ScreenShotViewModel#generatePicPathcom.fenbi.android.module.yingyu.ti.search.solution.SearchSolutionActivity#doShare
Gson
"userAnswers": {"0": {"questionId": 4989280,"answer": {"answer": "","type": 204}}}
怎么取最里面的 answer
private JsonElement userAnswers;final JsonElement jsonElement = exercise.getUserAnswers();if (jsonElement == null) {continue;}final JsonElement element = jsonElement.getAsJsonObject().get("0");if (element == null || ObjectUtils.isEmpty(element.toString())) {continue;}final WriteAnswerWrapper userAnswer = GsonUtils.fromJson(element.toString(), WriteAnswerWrapper.class);
渲染耗时
long timeMillis = System.currentTimeMillis();Log.e("LogTrack", "[LogTrack] render.100=" + (System.currentTimeMillis() - timeMillis));
Observable<Object> viewObservable = Observable.create(emitter -> {final ViewZip zip = new ViewZip();emitter.onNext(zip);emitter.onComplete();}).compose(ViewCreatorDebug.debugLogTransformer()).onErrorReturn(throwable -> new ViewZip());viewObservable.subscribe(new BaseApiObserver<Object>(lifecycleOwner) {@Overrideprotected void onSuccessResult(@NonNull Object data) {if (BoolUtil.isFalse(data instanceof ViewZip)) {return;}ViewZip zip = (ViewZip) data;// container.removeAllViews();// container.addView();}});
