关于项目框架总结

本文详细介绍了项目的整体架构,包括包名规范、变量命名规则、全局变量管理方式、网络请求处理流程及回调机制,并提供了ViewPager与Fragment的具体实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

未写完,可以在下面评论写完我回复你。

首先废话几句:这是本人的第一份正式工作,非常感谢公司教会我写代码,还有整体的架构。

关于这篇博客的性质,我定义为:不是技术文章,只是单纯的代码的写法:

 

一.先看包名的包名的整体架构:

 
关于包名的一般规则:com.公司名.项目名.模块名
com.shunfeng.ttp 应用启动类
com.shunfeng.ttp.app Application类
com.shunfeng.ttp.app.info 应用信息类(版本,路径,dubugMode等)
com.shunfeng.ttp.app.notification 通知处理类
com.shunfeng.ttp.xxx 界面类文件
com.shunfeng.ttp.base base层(可放全局控制类,Activity继承类)
com.shunfeng.ttp.components.xxx 组件类
com.shunfeng.ttp.data.xxx 数据层(db,file,sp等)
com.shunfeng.io.xxx 网络流
com.shunfeng.ttp.main 主类
com.shunfeng.ttp.net 网络层
com.shunfeng.ttp.trigger 触发器
com.shunfeng.ttp.util 工具类
 
二.关于变量的命名(在团队中代码不是给你一个人看,变量命名和函数命名非常重要,还有以后代码的维护也相当重要)
 
变量的名字可大小写混用,但首字符应小写。词由大写字母分隔,限制用下划线,限制使用美元符($),因为这个字符对内部类有特殊的含义。如:inputFileSize。
 
下面实例是在本项目中的变量名:
1.控件命名                      private Button btn_login;
2.常量命名                      private static final int AUTO_LOGIN=1;
3.关于安全性判断命名    private String module_id;
4.一般变量命名               private Handler autoLogin;
 
 
 
三.项目重头到尾的总结:
1.在项目中一般会重写android.app.Application  Application对象是该程序中唯一的,同一个程序中不同的Activity调用不同的Activity.getApplication()返回的都是同一个对象,
可以借助该对象在不同的Activity传递数据。在本项目中改类进行了一些初始化操作和开启了Service类,如下:
package com.yunda.ttp.app;

import android.app.Application;
import android.content.Intent;

import com.yunda.ttp.R;
import com.yunda.ttp.app.info.YundaTTPInfo;
import com.yunda.ttp.app.notification.AppNotification;
import com.yunda.ttp.base.ActivityControl;
import com.yunda.ttp.base.service.YundaServ;
import com.yunda.ttp.data.file.properties.HttpConfigReader;
import com.yunda.ttp.data.sp.SPContorller;
import com.yunda.ttp.net.http.HttpCaller;
import com.yunda.ttp.net.http.HttpRequestHandler;

public class YundaTTP extends Application {
 
 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  startService(new Intent(this, YundaServ.class));
  try {
   YundaServ.registerService(HttpRequestHandler.TAG, HttpRequestHandler.class);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  initSystems();
 }

 private void initSystems() {
  YundaTTPInfo.initDataPath(this);
  YundaTTPInfo.initDebugMode(this);
  YundaTTPInfo.setVersion(this);
  YundaTTPInfo.setVersionCode(this);
  
  HttpConfigReader.loadConfig(this,R.raw.http_config);
  HttpCaller.getCaller().initContext(this);
  AppNotification.getInstance().init(this);
  SPContorller.getInstance().init(this);
  ActivityControl.getInstance().init();
  ActivityControl.getInstance().setContext(this);
 }
 
}


 

2.项目中处理全局变量方法

定义一个变量类--------定义一个唯一一个得到变量类的工具类---------------通过工具类获取设值等。。

 

UserUtil.getLoginUser().setFine_notice(
     getIntent().getStringExtra("fine_id"));

 

 

package com.yunda.ttp.util;

import com.yunda.ttp.data.sp.SPContorller;
import com.yunda.ttp.io.user.UserInfoBean;

public class UserUtil {
 private static UserInfoBean loginUser;

 public static UserInfoBean getLoginUser() {
  return loginUser;
 }

 public static void setLoginUser(UserInfoBean loginUser) {
  UserUtil.loginUser = loginUser;
 }
 
 public static void setAutoLogin(boolean autoLogin, String pwd) {
  SPContorller.getInstance().setBooleanValue(SPContorller.id.AUTO_LOGIN, autoLogin);
  SPContorller.getInstance().setValue(SPContorller.id.AUTO_LOGIN_USERNAME, autoLogin ? loginUser.getUserName() : "");
  SPContorller.getInstance().setValue(SPContorller.id.AUTO_LOGIN_MOBILE, autoLogin ? loginUser.getMobile() : "");
  SPContorller.getInstance().setValue(SPContorller.id.AUTO_LOGIN_PWD, autoLogin ? pwd : "");
 }
}


 

package com.yunda.ttp.io.user;

import java.util.List;

import com.yunda.ttp.io.appeallist.AppealListResBeen;
import com.yunda.ttp.io.billlist.BillListDataBeen;
import com.yunda.ttp.io.noticelist.NoticeListDataBeen;

public class UserInfoBean {

 private List<AppealListResBeen> appeal_data_1=null;
 
 private List<AppealListResBeen> appeal_data_2=null;
 
 private List<AppealListResBeen> appeal_data_3=null;

 private List<AppealListResBeen> appeal_data_4=null;
 
 private List<NoticeListDataBeen> notice_data=null;
 
 private List<BillListDataBeen> bill_data=null;
 
 private String fine_notice=null;
 
 private String bill_notice=null;
 
 private String notice_notice=null;
 
 private String userName;

 private String password;

 private String mobile;

 private String safeQue;

 private String safeAns;

 private String typeName[];

 private String carLic;

 public String getUserName() {
  return userName;
 }

 
 


 public String getFine_notice() {
  return fine_notice;
 }

 

 

 public void setFine_notice(String fine_notice) {
  this.fine_notice = fine_notice;
 }

 

 

 public String getBill_notice() {
  return bill_notice;
 }

 

 

 public void setBill_notice(String bill_notice) {
  this.bill_notice = bill_notice;
 }

 

 

 public String getNotice_notice() {
  return notice_notice;
 }

 

 

 public void setNotice_notice(String notice_notice) {
  this.notice_notice = notice_notice;
 }

 

 

 public List<BillListDataBeen> getBill_data() {
  return bill_data;
 }

 

 

 public void setBill_data(List<BillListDataBeen> bill_data) {
  this.bill_data = bill_data;
 }

 

 

 public List<NoticeListDataBeen> getNotice_data() {
  return notice_data;
 }


 public void setNotice_data(List<NoticeListDataBeen> notice_data) {
  this.notice_data = notice_data;
 }


 public void setUserName(String userName) {
  this.userName = userName;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

 public String getMobile() {
  return mobile;
 }

 public void setMobile(String mobile) {
  this.mobile = mobile;
 }

 public String getSafeQue() {
  return safeQue;
 }

 public void setSafeQue(String safeQue) {
  this.safeQue = safeQue;
 }

 public String getSafeAns() {
  return safeAns;
 }

 public void setSafeAns(String safeAns) {
  this.safeAns = safeAns;
 }

 

 public String[] getTypeName() {
  return typeName;
 }

 public void setTypeName(String[] typeName) {
  this.typeName = typeName;
 }

 public String getCarLic() {
  return carLic;
 }

 public void setCarLic(String carLic) {
  this.carLic = carLic;
 }

 public List<AppealListResBeen> getAppeal_data_1() {
  return appeal_data_1;
 }

 public void setAppeal_data_1(List<AppealListResBeen> appeal_data_1) {
  this.appeal_data_1 = appeal_data_1;
 }

 public List<AppealListResBeen> getAppeal_data_2() {
  return appeal_data_2;
 }

 public void setAppeal_data_2(List<AppealListResBeen> appeal_data_2) {
  this.appeal_data_2 = appeal_data_2;
 }

 public List<AppealListResBeen> getAppeal_data_3() {
  return appeal_data_3;
 }

 public void setAppeal_data_3(List<AppealListResBeen> appeal_data_3) {
  this.appeal_data_3 = appeal_data_3;
 }

 public List<AppealListResBeen> getAppeal_data_4() {
  return appeal_data_4;
 }

 public void setAppeal_data_4(List<AppealListResBeen> appeal_data_4) {
  this.appeal_data_4 = appeal_data_4;
 }
}



 

3.关于网络请求的处理,个人感觉写的非常好,不管结构上还是安全性上。

(只贴核心代码,代码量太大)

 

请求内容 module_id对应的接口   比如     C016=/versionUpdate.do     public static final String MODULE_ID_UPDATE_VERSION="C016";

VersionReq req = new VersionReq(); 

 req.setVersioncode(versionCode);

reqID = HttpCaller.getCaller().call(module_id = HttpCaller.id.MODULE_ID_UPDATE_VERSION, req);(reqID和module_id回调讲用到,未来安全性)

 

处理请求:注意reqID变量的变化

private synchronized int _call(String module_id, RequestBean param, Handler reHandler) {
  String url = getUrl(module_id);

  if (!vaild(url, module_id, param)) {
   return REQUEST_ID_INVALID;
  }

  if (reqID >= REQUEST_ID_MAX) {
   reqID = REQUEST_ID_INVALID;
  }
  reqID++;
  boolean pushed = false;
  String sResBean = beans.getProperty(module_id);
  if (sResBean != null && !"".equals(sResBean)) {
   try {
    Class<?> resBean = Class.forName(sResBean);
    pushed = httpReqHandler.sendMessage(httpReqHandler.obtainMessage(HttpRequestHandler.HTTP_REQUEST, new RequestPackage(url, module_id, reqID, System.currentTimeMillis(), resBean, param,
      reHandler)));
   } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  if (!pushed) {
   reqID--;
   return REQUEST_ID_INVALID;
  }

  return reqID;
 }

发出请求

if (msg.what == HTTP_REQUEST) {
   ResponsePackage rep = new ResponsePackage();
   try {
    if (!(msg.obj instanceof RequestPackage)) {
     Log.e(TAG, "IllegalException object in MessageQueue is not instance of RequestPackage");
     return;
    }
    
    int reqID = ((RequestPackage) msg.obj).getReqID();
    rep.setReqID(reqID);
    rep.setModule_id(((RequestPackage) msg.obj).getModule_id());
    String reqContent = "";
    try {
     reqContent = HttpUtil.objectToJson(((RequestPackage) msg.obj).getParam());
     String request = ((RequestPackage) msg.obj).getUrl();
     request = request.substring(request.lastIndexOf("/") + 1, request.lastIndexOf("."));
     reqContent = HttpUtil.security(PARTNERID, String.valueOf(YundaTTPInfo.getVersion()), PASSWORD, request, reqContent);
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     return;
    }
    if (YundaTTPInfo.isDebugMode()) {
     Log.d(TAG, "send:" + reqContent);
    }
    String res = doRequest(HttpConfigReader.getConfig(HttpConfigReader.CONFIG_KEY_HTTP_SERVER_URL)+HttpConfigReader.getConfig(HttpConfigReader.CONFIG_KEY_HTTP_SERVER_URL_SUFFIX), reqContent);
    
    if (YundaTTPInfo.isDebugMode()) {
     Log.d(TAG, "received:" + res);
    }
    try {
     rep.setParam((ResponseBean) HttpUtil.parseJson(res, ((RequestPackage) msg.obj).getResBean()));
     rep.setResponseTime(System.currentTimeMillis());
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    ResponseBean res = new ResponseBean();
    res.setResult(null);
    res.setErrorcode("x99");
    rep.setParam(res);

    e.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    if (((RequestPackage) msg.obj).getReHandler() != null) {
     ((RequestPackage) msg.obj).getReHandler().sendMessage(((RequestPackage) msg.obj).getReHandler().obtainMessage(TriggerInfo.id.TRIGGER_ID_RESPONSE, rep));
     return;
    }
    TriggerInfo triggerInfo = new TriggerInfo(TriggerInfo.id.TRIGGER_ID_RESPONSE);
    triggerInfo.setObjParam(rep);
    ActivityControl.getInstance().sendTriggerToScreen(triggerInfo);
   }

  }

 

回调处理函数


public void OnTrigger(int iTriggerID, TriggerInfo info) {

  switch (iTriggerID) {
  case TriggerInfo.id.TRIGGER_ID_RESPONSE:
   ResponseBean res;
   try {
    res = NetUtil.checkResBean(info.getObjParam(), reqID,
      module_id, this, R.string.unbind_failure);// //重点
    if (res == null) {
     return;
    }
    if (module_id.equals(HttpCaller.id.MODULE_ID_UNBIN)) {
            //重点
    }
   } catch (IllegalArgumentException e) {
    return;
   } finally {
    if (waitDialog != null && waitDialog.isShowing()) {
     waitDialog.dismiss();
    }
   }
   break;
  }
 }


 

关于回调的过程下面来讲

 

4.关于回调

 

定义的触发器,还有回调接口等。

package com.yunda.ttp.trigger;

public class TriggerInfo {

 public static class id {
  public static final int TRIGGER_ID_START = 0;

  public static final int TRIGGER_ID_TEST = TRIGGER_ID_START + 1;

 
  
 }

 private int triggerID;

 

 public Object getObjParam() {
  return objParam;
 }

 public void setObjParam(Object objParam) {
  this.objParam = objParam;
 }

 public interface TriggerSender{
  public TriggerReceiver getTriggerReceiver();
 }
 
 public interface TriggerReceiver{
  public void onTrigger(int iTriggerID, TriggerInfo info);
 }
}


2.

public class MainActivity extends FragmentActivity implements OnClickListener,
  TriggerSender {

  public TriggerReceiver getTriggerReceiver(){

//得到下面实例
 }

}

public class NotificationFragment extends Fragment implements TriggerReceiver 

{

public void onTrigger(int iTriggerID, TriggerInfo info)

{

//回调处理

}

}

 

public void setCurrentActivity(Activity currentActivity) {
  if (currentActivity==null) {
   this.currentActivity=null;
   triggerSender=null;
   return;
  }
  this.currentActivity = currentActivity;
  if (currentActivity instanceof TriggerSender) {
   triggerSender=(TriggerSender) currentActivity;
  }
 }

public void onTrigger(int iTriggerID, TriggerInfo info) {
  // TODO Auto-generated method stub
  triggerSender.getTriggerReceiver().onTrigger(iTriggerID, info);
 }

 

五.ViewPager和Fregment

代码只是核心部分,编译可能出错

package com.yunda.ttp.main;

import java.util.ArrayList;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.viewpagerindicator.IconPagerAdapter;

public class MainFragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter {
	
    private int mCount = 5;
    private ArrayList<Fragment> fragments;

    public MainFragmentAdapter(FragmentManager fm,ArrayList<Fragment> fragments) {
        super(fm);
        this.fragments=fragments;
    }

    @Override
    public Fragment getItem(int position) {
    	return fragments.get(position);
    }

    @Override
    public int getCount() {
        return mCount;
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }

	@Override
	public int getIconResId(int index) {
		// TODO Auto-generated method stub
		return 0;
	}
}


 

public class MainActivity extends FragmentActivity implements OnClickListener,
  TriggerSender {

 private boolean  activity_top;
 public String module_id;

 public int reqID;

 private ActivityControl mWinControl;

 private MainFragmentAdapter mAdapter;

 public ViewPager mPager;

 private PageIndicator mIndicator;

 private ArrayList<Fragment> fragments = new ArrayList<Fragment>();

 private FineFragment fineFragment = new FineFragment();

 private InTransitFragment inTransitFragment = new InTransitFragment();

 private BillFragment billFragment = new BillFragment();

 private NotificationFragment notificationFragment = new NotificationFragment();

 private SettingFragment settingFragment = new SettingFragment();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mWinControl = ActivityControl.getInstance();
  mWinControl.setCurrentActivity(this);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  // The look of this sample is set via a style in the manifest
  setContentView(R.layout.simple_underlines);

  fragments.add(fineFragment);
  fragments.add(inTransitFragment);
  fragments.add(billFragment);
  fragments.add(notificationFragment);
  fragments.add(settingFragment);
  mAdapter = new MainFragmentAdapter(getSupportFragmentManager(),
    fragments);

  mPager = (ViewPager) findViewById(R.id.pager);
  mPager.setAdapter(mAdapter);

  exitDlg = new CustomDialog(this, new ExitLayer(this), 210, 170)
    .setPositiveBtnListener(exitListener).setNegativeBtnListener(
      noExitListener);

 
 }

}


 


 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值