本人Android實際開發(fā)工作經(jīng)驗3年磨镶,新加入一家互聯(lián)網(wǎng)公司負責項目重構(gòu)邪蛔,用戶100W+急黎,app已經(jīng)迭代開發(fā)2年之久,存在代碼結(jié)構(gòu)不清醒侧到,業(yè)務邏輯混亂勃教,命名不規(guī)范,所以進行項目重構(gòu)匠抗,重構(gòu)是一個不斷完善的過程故源,這是我前期根據(jù)項目需求定的一個框架,新手很多不足汞贸,希望多多指教哈绳军!
project端工程介紹:
1:項目業(yè)務集成基于mvp+proxy結(jié)構(gòu)
2:大部分模塊含有core為當前模塊核心結(jié)構(gòu)
2:除以下模塊還有entity印机,constant等輔助模塊
app模塊:
工程初始化:分為以下base初始化類
baseApplication:工程啟動初始化
baseActivity:頁面初始化
baseModel:工程數(shù)據(jù)模型
Briage模塊:
”橋“ 分為以下子模塊
factory:功能模塊工廠加工,組件連接
Manager:功能模塊集成
Croes模塊:
工程核心模塊门驾,mvp模式
其中v模塊:
activity:分工負責頁面生命周期與Android其他四大組件交互
layout:由各子proxyview類代理
Assemly模塊:
“組件模塊”分為三部分:service,broadcast,contentprovide
Assistant模塊:
項目幫助模塊:分為以下子模塊
Cache:工程緩存模塊
Helper:工程幫助處理模塊
Net:工程網(wǎng)絡處理模塊
security:工程安全模塊
Modles模塊:
”模型“ 模塊 分為以下子模塊:
modle:數(shù)據(jù)模型射赛,業(yè)務模型
Presenters模塊:
”交互層模塊“分為以下子模塊
adapter:適配器
prsenter:交互類
Views模塊:
”View“ 模塊‘分為以下子模塊:
cores:view模塊結(jié)構(gòu)核心
Ui:activity 頁面
window:分為fragment,dialog奶是,view
ProxyView模塊:
”View代理“ 代理activity關(guān)于view一切初始化
下面Cores模塊部分代碼示例楣责,基于mvp思想,根據(jù)項目重構(gòu)實際修改:
/* --------------------------------SettingActivity.java------------------------------------------------*/
public class SettingActivity extends BaseActivity {
private SettingPresentersettingPresenter;
@Override
? ? protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
initCore();
}
@Override
? ? public void initCore() {
settingPresenter=new SettingPresenter();
settingPresenter.initCreate(this);
}
@Override
? ? public void onEventMainThread(Event event) {
super.onEventMainThread(event);
}
@Override
? ? protected void onPause() {
super.onPause();
DialogHelper.dismissDialog(settingPresenter.getSettingProxyView().mComfirmDialog);
DialogHelper.dismissDialog(settingPresenter.getSettingProxyView().mLoadingDialog);
if (settingPresenter.getSettingProxyView().activity.isFinishing()) {
settingPresenter.getSettingProxyView().mLoadingDialog =null;
settingPresenter.getSettingProxyView().mComfirmDialog =null;
}
}
@Override
? ? protected void onDestroy() {
super.onDestroy();
settingPresenter.detachView();
}
}
/* --------------------------------SettingPresenter.java---------------------------------------------*/
public class SettingPresent erextends BasePresenter {
private SettingModelsettingModel;
private SettingProxyViewsettingProxyView;
public SettingModel getSettingModel() {
return settingModel;
}
public SettingProxyView getSettingProxyView() {
return settingProxyView;
}
@Override
? ? public void initCreate(BaseActivity activity) {
settingProxyView =new SettingProxyView(activity,this);
settingModel=new SettingModel();
attachView(settingProxyView);
}
@Override
? ? public void initView() {
}
@Override
? ? public void initData() {
settingModel.addProxyView(settingProxyView);
settingModel.initRadioGroup();
}
@Override
? ? public void initEvent() {
}
@Override
? ? public void ViewOnClick(View view) {
switch (view.getId()){
case R.id.setting_check_version:
settingModel.checkNewVersion();
ClickAgentHelper.getInstance().addClickLog(ClickLog.S_LOG_CLICK_SETTING_CHECK_UPDATE);
break;
case R.id.setting_about:
Intent i =new Intent(settingProxyView.activity, AboutActivity.class);
settingProxyView.activity.startActivity(i);
ClickAgentHelper.getInstance().addClickLog(ClickLog.S_LOG_CLICK_SETTING_ABOUT);
break;
default:
break;
}
}
@Override
? ? public void ViewOnLongClick(View view) {
}
}
/* ————————————————BasePresenter.java--------------------------------------------/**
* 交互層
* <基礎業(yè)務類>*/
public abstract class BasePresenter implements Presenterlmp, ViewEventListenter {
protected ProxyViewproxyView;
public BasePresenter() {
}
public final void attachView(ProxyView proxyView) {
this.proxyView = proxyView;
initView();
initData();
initEvent();
}
public void detachView(){
LogHelper.d("detachView");
proxyView =null;
}
public abstract void initView();
public abstract void initData();
public abstract void initEvent();
@Override
? ? public String getName() {
return proxyView.getClass().getSimpleName();
}
}
/* ————————————————SettingProxyView.java-------------------------------------------
public class SettingProxyView extends ProxyView {
public DialogmLoadingDialog =null;
public DialogmComfirmDialog =null;
public RadioGroupmBBSpeedRG =null;
public RadioGroupmManYiRG =null;
public CheckBoxmSpeekWcRG =null;
public RadioGroupmNaviOrientationRG =null;
public RadioGroupmNaviDayOrNightRG =null;
public RadioGroupmNaviMapDirectionRG =null;
public RadioGroupmNaviShijiaoRG =null;
public RadioGroupmFontSizeRG =null;
public CheckBoxmIntelligentBroadcastRG =null;
public CheckBoxmUMPushRG =null;
public CheckBoxmShowLimitMarkerRG =null;
public CheckBoxmTestOpenCB =null;
public TextViewmTitle=null;
public TextViewmTips=null;
public SettingProxyView(BaseActivity activity, ViewEventListenter viewEventListenter) {
super(activity,viewEventListenter);
initView();
initViewEvent();
}
@Override
? public void initView() {
mLoadingDialog = DialogHelper.getLoadingDialog(activity);
mComfirmDialog = DialogHelper.getComfirmDialog(activity);
mTitle = (TextView) getView(R.id.nav_title);
mTips = (TextView) getView(R.id.title_tips);
mBBSpeedRG = (RadioGroup) getView(R.id.setting_voice);
mSpeekWcRG = (CheckBox)getView(R.id.setting_welcome_voice);
mNaviOrientationRG = (RadioGroup)getView(R.id.setting_screen);
mNaviDayOrNightRG = (RadioGroup)getView(R.id.setting_nav_daymode);
mIntelligentBroadcastRG = (CheckBox)getView(R.id.setting_speed);
//導航方向
? ? ? mNaviMapDirectionRG = (RadioGroup)getView(R.id.setting_nav);
//導航模式 2D聂沙,3D
? ? ? mNaviShijiaoRG = (RadioGroup)getView(R.id.setting_nav_perspective);
//字體大小
? ? ? mFontSizeRG = (RadioGroup)getView(R.id.setting_fount_size);
//推送消息
? ? ? mUMPushRG = (CheckBox)getView(R.id.setting_push_msg);
mShowLimitMarkerRG = (CheckBox)getView(R.id.setting_restricted);
mTestOpenCB = (CheckBox)getView(R.id.setting_test_open);
}
@Override
? public void initViewEvent() {
mTitle.setText(activity.getResources().getText(R.string.setting_title));
mTips.setVisibility(View.GONE);
addOnClickListenter(getView(R.id.setting_check_version));
addOnClickListenter(getView(R.id.setting_about));
}
@Override
? public void ViewOnClick(View view) {
mViewEventListenter.ViewOnClick(view);
}
@Override
? public void ViewOnLongClick(View view) {
mViewEventListenter.ViewOnLongClick(view);
}
}
/* ————————————————ProxyView.java---------------------------------------------/**
*/
public? abstract? class ProxyView ?implements View.OnClickListener,View.OnLongClickListener{
private static final StringTAG =ProxyView.class.getSimpleName();
public ViewEventListentermViewEventListenter;
/**
* 返回按鈕
*/
? private Viewback;
/**
* 標題
*/
? public TextViewtitle;
/**
* 右邊字符
*/
? public TextViewmTips;
private TextViewright;
public BaseActivityactivity;
public ProxyView(BaseActivity activity, ViewEventListenter viewEventListenter) {
this.mViewEventListenter=viewEventListenter;
this.activity=activity;
setHeader();
}
public abstract? void initView();
public abstract void initViewEvent();
public abstract void ViewOnClick(View view);
public abstract void ViewOnLongClick(View view);
public void setHeader() {
back=getView(R.id.button_back);
mTips=(TextView)getView(R.id.title_tips);
title=(TextView)getView(R.id.nav_title);
if(back!=null)addOnClickListenter(back);
}
public? void setTitle(String content){
if(title!=null)title.setText(content);
}
public? void onClickBackButton()
{
activity.finish();
}
public? View? getView(int ViewId){
return? activity.findViewById(ViewId);
}
public? void? addOnClickListenter(View view){
if (view==null)return;
view.setClickable(true);
view.setOnClickListener(this);
}
public? void? addOnLongClickListenter(View view){
view.setClickable(true);
view.setOnLongClickListener(this);
}
@Override
? public void onClick(View view) {
switch (view.getId()){
case R.id.button_back:
if (isFastClick()) {
return;
}
onClickBackButton();
break;
}
ViewOnClick(view);
}
@Override
? public boolean onLongClick(View view) {
ViewOnLongClick(view);
return false;
}
private long mLastClickTime =0;
private static final int CLICK_SPACE_TIME =800;
public boolean isFastClick() {
long currentTime = System.currentTimeMillis();
boolean isFast =false;
if (currentTime -mLastClickTime >CLICK_SPACE_TIME) {
isFast =false;
}else {
isFast =true;
}
mLastClickTime = currentTime;
return isFast;
}
}
/* ————————————————SettingModel.java--------------------------------------------
public class SettingModel implements Modlelmp {
private SettingProxyView settingProxyView;
@Override
? ? public void addProxyView(ProxyView proxyView) {
this.settingProxyView =(SettingProxyView) proxyView;
}
@Override
? ? public void initModleData() {
}
public void checkNewVersion() {}
………………………………………………..省略大量數(shù)據(jù)模型秆麸,業(yè)務邏輯代碼
………………………………………………..………………………………………………..………………………………………………..
………………………………………………..………………………………………………..………………………………………………..
}
/* ————————————————CoreFactory.java---------------------------------------------
/**
* <中間連接層>*
*/
public class CoreFactory {
private static CoreFactorymodel;
public static void init(Context context) {
model =new CoreFactory();
model.iniLocalFileStorageManager();
model.initPreferenceManager();
model.initSecurityManager();
model.initUserSession();
model.initCoreServiceManager(context);
model.initOkHttpManager();
model.initImageManager();
}
public static void destroy() {
model =null;
}
/**
* 初始化本地存儲路徑管理類
*/
? ? private void iniLocalFileStorageManager() {
BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(LocalFileStorageManager.TAG,LocalFileStorageManager.getInstance());
}
/**
* 初始化SharedPreference管理類
*/
? ? private void initPreferenceManager() {
BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(SharedPrefManager.TAG,SharedPrefManager.getInstance());
}
/**
* 網(wǎng)絡請求管理類
*/
? ? private void initOkHttpManager() {
BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(HttpManager.TAG, HttpManager.getInstance());
}
/**
* 圖片管理類
*/
? ? private void initImageManager() {
BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(ImageMangaer.TAG, ImageMangaer.getInstance());
}
/**
* 初始化安全模塊
*/
? ? private void initSecurityManager() {
}
/**
* 初始化用戶信息模塊
*/
? ? private void initUserSession() {
}
/**
* 初始化Tcp服務
*
? ? * @param context
? ? */
? ? private void initCoreServiceManager(Context context) {
}
private void initDBManager() {
}
}
正在重構(gòu)學習階段,希望能得到多多指點及汉,也希望能給大家提供一些幫助…….第一次寫博客沮趣,哈哈!?浪妗7棵!