重构 Airport 模块

来源:互联网 发布:ubuntu iptables 重启 编辑:程序博客网 时间:2024/05/17 22:24

当一个项目开始时,它总是很简洁,很优雅,就像:

val a = 1
随着项目越来越复杂,糟糕的代码不断加入,代码变得混乱难以维护。

CleanCode 中形容这叫沼泽。


重构可以让代码变得更好

@Route(path = RoutePath.AIRPORT)public class AirportAct extends BaseAct {    @Override    protected int layoutResId() {        return R.layout.act_airport;    }    @Override    protected void inject() {        AppComponentProvider.provide().inject(this);    }    @Override    protected void init(Bundle savedInstanceState) {        clickCancel();        initEtSearch();        initIndexableLayout();    }    // ======================== 取消 ========================    private void clickCancel() {        RxView.clicks(findViewById(R.id.tvCancel))                .throttleFirst(2, TimeUnit.SECONDS)                .subscribe(aVoid -> finish());    }    // ======================== 按名称或拼音查询机场 ========================    @BindView(R.id.etSearch)    EditText etSearch;    @BindView(R.id.btnUpdate)    LoginButton btnUpdate;    @BindColor(R.color.md_grey_50)    int grey50;    @BindColor(R.color.md_grey_300)    int grey300;    @BindColor(R.color.md_grey_400)    int grey400;    @Inject    AirportHelper airportHelper;    private void initEtSearch() {        // 背景        GradientDrawable etSearchBg = new GradientDrawable();        etSearchBg.setCornerRadius(ConvertUtils.dp2px(5));        etSearchBg.setStroke(1, grey300);        etSearchBg.setColor(grey50);        etSearch.setBackground(etSearchBg);        etSearch.setHintTextColor(grey400);        // 查询图标        Drawable search = new IconicsDrawable(this)                .icon(Ionicons.Icon.ion_ios_search)                .colorRes(R.color.colorPrimary)                .sizeDp(17);        etSearch.setCompoundDrawablePadding(ConvertUtils.dp2px(8));        etSearch.setCompoundDrawables(search, null, null, null);        // 查询        RxTextView.afterTextChangeEvents(etSearch)                .map(event -> event.editable().toString().trim())                .flatMap(query -> airportService.listByNameOrPinyin(query))                // indexableAdapter 有个 bug 不得不过滤下                .filter(airports -> airports.size() != 0)                .observeOn(AndroidSchedulers.mainThread())                .subscribe(airports -> airportAdapter.setDatas(airports));        //更新机场列表        RxView.clicks(btnUpdate)                .throttleFirst(1, TimeUnit.SECONDS)                .subscribe(aVoid -> airportHelper.updateAirportByLastUpdateDate(new AirportHelper.UpdateListener() {                    @Override                    public void onUpdateSuccess(int size) {                        if (size > 0) {                            airportService.listUsed()                                    .filter(airportList -> airportList.size() != 0)                                    .subscribe(airportList -> airportAdapter.setDatas(airportList));                        }                    }                }));                /*.map(aVoid -> airportHelper.updateAirportByLastUpdateDate())                .delay(1, TimeUnitDelete.SECONDS, AndroidSchedulers.mainThread())                .flatMap(aVoid -> airportService.listUsed())                .filter(airportList -> airportList.size() != 0)                .subscribe(airportList -> airportAdapter.setDatas(airportList));*/    }    // ======================== 机场索引列表 ========================    @BindView(R.id.indexableLayout)    IndexableLayout indexableLayout;    @Inject    AirportService airportService;    @Inject    AirportAdapter airportAdapter;    private void initIndexableLayout() {        indexableLayout.setLayoutManager(new LinearLayoutManager(this));        indexableLayout.setCompareMode(IndexableLayout.MODE_ALL_LETTERS);        setCenterOverlay();        indexableLayout.setAdapter(airportAdapter);        addItemDecoration();        setOnItemContentClickListener();        // 加载列表        airportService.listUsed()                // indexableAdapter 有个 bug 不得不过滤下                .filter(airports -> airports.size() != 0)                .observeOn(AndroidSchedulers.mainThread())                .subscribe(airports -> airportAdapter.setDatas(airports));    }    /**     * setCenterOverlay.     */    @BindColor(R.color.colorPrimary)    int colorPrimary;    private void setCenterOverlay() {        indexableLayout.setOverlayStyle_Center();        indexableLayout.getmCenterOverlay().setBackgroundColor(Color.TRANSPARENT);        indexableLayout.getmCenterOverlay().setTextColor(colorPrimary);        indexableLayout.getmCenterOverlay().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 50);    }    /**     * addItemDecoration.     */    private void addItemDecoration() {        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setStrokeWidth(1);        paint.setColor(grey300);        HorizontalDividerItemDecoration itemDecoration = new HorizontalDividerItemDecoration.Builder(this).paint(paint).build();        indexableLayout.getRecyclerView().addItemDecoration(itemDecoration);    }    /**     * setOnItemContentClickListener.     */    private void setOnItemContentClickListener() {        airportAdapter.setOnItemContentClickListener((v, originalPosition, currentPosition, airport) -> {            if (originalPosition >= 0) {                RxBus.get().post(RxBusTag.AIRPORT_SELECTED, airport);                finish();            }        });    }}