未写完,可以在下面评论写完我回复你。
首先废话几句:这是本人的第一份正式工作,非常感谢公司教会我写代码,还有整体的架构。
关于这篇博客的性质,我定义为:不是技术文章,只是单纯的代码的写法:
一.先看包名的包名的整体架构:
关于包名的一般规则: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);
}
}