继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

android开发(如何开发一个可以维护的好项目):一 、定义基类

慕码人3916992
关注TA
已关注
手记 102
粉丝 81
获赞 3602

做 android开发,如果想开发一个可以维护的好项目,就得有个好的结构,和好的思想,如何去开发android,我便在这里讲解一下。首先,我要推荐一下我个人使用的mvp框架,目前也是我公司在使用的框架。这套框架最早是我建立的,目前我在维护和继续开发。框架地址dileber android框架 希望大家能多多star一下,点个赞啥的~如下也是对这个框架的一些讲解
首先做项目需要基类 activity有activity的基类,fragment 有fragment 的基类

建立一个TBaseActivity,这个类是抽象的,这个类实现了BView,BView包含了toast(提示),showAlert(弹框),loading(加载框),loadDialogDismiss(取消加载框),dialogOk(选择框),getContext(获取当前acitivity )。你看到的里面已经实现了,都是dileber框架里整合的一些ui控件。UUi 是ui的一些类,UDialog 是dialog 的方法,onDestroy和onResume,主要是生命周期的一类方法。

public abstract class TBaseActivity extends BaseActivity implements BView{

    BasePresenter presenter;

    @Override
    public void toast(String msg, int duration) {
        UUi.toast(this,msg,duration);
    }

    @Override
    public void showAlert(Integer type, String message) {
        Logger.d("显示dialog");
        UDialog.alert(type,message).show();

    }

    Dialog dialog;

    @Override
    public void loading() {
        if(dialog==null){
            dialog =UDialog.loading();
        }
        dialog.show();
    }

    @Override
    public void loadDialogDismiss() {
        if(dialog!=null){
            dialog.dismiss();
        }
    }

    @Override
    public void dialogOk(String content, DialogLinstener dialogLinstener) {
        UDialog.dialogOk(content,dialogLinstener).show();
    }

    @Override
    public Context getContext() {
        return this;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(presenter!=null){
            presenter.start();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(presenter!=null){
            presenter.onDestroy();
        }
        if(dialog!=null){
            dialog.dismiss();
        }

    }

}

fragment的基类,和activity一样,就是多添加了一个监听器,能够和activity进行交互。数据的传输,目前我写的主要是交互 修改activity的标题,和activity最右边的button的样子,和button的事件

public abstract class TBaseFragment extends BaseFragment implements BView{

    protected BasePresenter presenter;

    @Override
    public void toast(String msg, int duration) {
        UUi.toast(getActivity(),msg,duration);
    }

    @Override
    public void showAlert(Integer type, String message) {
        Logger.d("显示dialog");
        UDialog.alert(type,message).show();

    }

    Dialog dialog;

    @Override
    public void loading() {
        if(dialog==null){
            dialog =UDialog.loading();
        }
        dialog.show();
    }

    @Override
    public void loadDialogDismiss() {
        if(dialog!=null){
            dialog.dismiss();
        }
    }

    @Override
    public void dialogOk(String content, DialogLinstener dialogLinstener) {

    }

    @Override
    public Context getContext() {
        return getActivity();
    }

    @Override
    public void onResume() {
        super.onResume();
        if(presenter!=null){
            presenter.start();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(presenter!=null){
            presenter.onDestroy();
        }
        if(dialog!=null){
            dialog.dismiss();
        }
    }

    public void setPresenter(BasePresenter presenter) {
        this.presenter = presenter;
    }

    protected OnFragmentInteractionListener mListener;

    public interface OnFragmentInteractionListener {
        SFont onRightButtonFont(Integer res);
        void onTitleName(String title);
    }

    public SFont setRightButtonFont(Integer res) {
        if (mListener != null) {
            return mListener.onRightButtonFont(res);
        }
        return null;
    }

    public void setTitle(String title){
        if (mListener != null) {
            mListener.onTitleName(title);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

}

还有一个并不能算是基类,但是在android开发中,需要自定义的一个类,入口类
Application

首先有个注解SFontdType,这个注解是我自定义的,这个注解的作用是将图标注入到android系统中,我将图标做成字体的形式,之后就能够注入系统,减少apk的大小,我的这篇手记有详细介绍 链接 如何更好的设计android图标 这个里面使用的是我最早写的dileber 1.0的代码,由于后期发现当时写的框架并不是很好,于是现在重新写了这个项目,原来1.0的版本也就不再维护了。全部用新项目了。

appForbidden方法,是网络请求出现403时回调的方法,如果出现403(网络请求被禁止,一般是请求出现权限不足,可能是session丢失了,于是我就在这里添加了回调接口,如果出现session丢失,框架会回调这个方法,让你去重新登录系统,或者刷新session,并且在刷新完后,你可以继续执行你刚刚被禁止的请求)
crash = false 是关闭掉 崩溃日志记录的代码。你可以打开它。
attachBaseContext 是做dex分包,如果你的项目小的话,没必要写这个。

@SFontdType(value = "icomoon.ttf")
public class TApplication extends SApplication {
    private static int forbidden = 0;

    @Override
    public void start() {
        crash = false;
    }

    @Override
    protected void init() {
        DemoHelper.getInstance().init(this);
    }

    private static final int maxForbidden = 10;

    @Override
    public void appForbidden(final Call call, Response response, final RetCallback retCallback) {
        forbidden ++;
        if(forbidden>10){
            UiUtils.loginAgain(this,"账户需要重新登录");
            forbidden = 0;
            return;
        }
        final UserDataSource userDataSource = UserRepository.getInstance();

        userDataSource.getUser(new BaseDataSource.BaseCallback<UserModel>() {
            @Override
            public void onSuccess(UserModel userModel) {
                userDataSource.checkUser(userModel, new BaseDataSource.BaseCallback<UserWrapper>() {
                    @Override
                    public void onSuccess(UserWrapper userWrapper) {

                        if(userWrapper.getState()== NetWorkEnum.Success.getVar()){
                            UserModel userModel1 = userWrapper.getData();
                            if(userModel1==null){
                                UUi.toast(ActivityManager.getCurrentActivity(),"用户异常,请检查", Toast.LENGTH_SHORT);
                            }else{
                                /**
                                 * 再次请求
                                 */
                                call.clone().enqueue(retCallback);
                            }

                        }else if(userWrapper.getState()==NetWorkEnum.Error.getVar()){
                            UiUtils.loginAgain(TakkyuuApplication.this,userWrapper.getMsg());
                        }
                    }

                    @Override
                    public void onFailure(DataSourceException e) {
                        UiUtils.loginAgain(TApplication.this,"账户需要重新登录");
                    }
                });
            }

            @Override
            public void onFailure(DataSourceException e) {

            }
        });
    }

    /**
     * 分割 Dex 支持
     * @param base
     */
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

如上是最基础的三个类,都是我项目中使用的,我会继续讲解后续内容(包括如何使用mvp,如何将网络请求归类,如何解偶,fragment的工厂方法,如何正确使用fragment,如何使用框架里的网络请求,如何保存和使用session,如何使用枚举类,如何更好的使用android的本地存储,如何绘制基金图表),最终会把这个框架的内容全部讲解完毕。

打开App,阅读手记
15人推荐
发表评论
随时随地看视频慕课网APP

热门评论

目前还看不懂,迷茫啊。

查看全部评论