做 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的本地存储,如何绘制基金图表),最终会把这个框架的内容全部讲解完毕。
共同学习,写下你的评论
评论加载中...
作者其他优质文章