平板点餐软件编程体会---记我的Android编程之路
前言
想开发一个平板点餐系统,研究下陈江根大侠分享的一个很高水准的实例,只是个单机版无实用意义。
实现
本系统后台使用Mysql 数据库+Tomcat WEb服务器实现,Tomcat服务器采用Servlet机制处理App发来的消息,并执行消息的任务;另外采用XE2编程实现管理客户端,用来来处理订单打印、管理菜谱管理等。
app客户端为Android版本,编程工具Eclipse。
难点处理
1.一个订单发送到后台没问题多条怎么就不行了,哦,应该使用线程;
/**异步任务:下单 2014-8-28
*
* @author 吴chunyuan *
*/
private class XiadTask extends AsyncTask<String, Integer, String> {
/**onPreExecute方法用于在执行后台任务前做一些UI操作 */
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute() called");
// MyUtil.showToast(OrderActivity.this, "数据上传...");
// textView.setText("loading...");
} /**doInBackground方法内部执行后台任务,不可在此方法内修改UI*/
@Override
protected String doInBackground(String... params) {
//totalText = (TextView) findViewById(R.id.total);
//params[0]
Log.i(TAG, "doInBackground(Params... params) called"); String replay ="0"; //定义为 count+"|"已成功下单编号1|2...
try
{
if(mc == null){
mc = new MyConnector(ServerIP, SERVER_PORT);
}
int count=mData.size(); int j=0;
int NewcaiCount=0;//统计新菜数量 2014-8-28
while( j < count){
if(mData.get(j).getState()==0){
NewcaiCount++;
}
j++;
} // replay = String.valueOf(count);
int i=0;
int bs=0;
double Stotal=0.00; //金额
while( i < count){
// msg =菜名|ID|数量|价格|状态|
//wxd_count=wxd_count+1; if(mData.get(i).getState()==0){
//算出金额
Stotal=Stotal+Double.parseDouble( String.valueOf(mData.get(i).getPrice()) )*Double.parseDouble( String.valueOf(mData.get(i).getNum()) );
// Double d = Double.parseDouble( s ); String GetData = mData.get(i).getName()
+"|"+String.valueOf(mData.get(i).get_id())
+"|"+String.valueOf(mData.get(i).getNum())
+ "|"+String.valueOf(mData.get(i).getPrice())
// + "|"+String.valueOf(mData.get(i).getState())
+"|"+ String.valueOf(mData.get(i).getRemark())
+"|"+String.valueOf(mData.get(i).getMenuID())
+"|"+table_no
+"|"+String.valueOf(Stotal); bs++;
if ((i==count-1) || (bs==NewcaiCount)) {// 888 \999,做为后台是否修改ordertal tabletal 的判断。
if (bs==1) bs=888; //最后一笔且只有1笔
else bs=999;
} String [] sa=GetData.split("\\|");
//Bs 记录标志
String Bs=String.valueOf(bs) ; //标志 菜名 数量 价格 备注 菜单ID 台号 金额
String msg_out = "<#ADD_DINGD#>"+Bs+"|"+sa[0] +"|"+sa[1]+"|"+sa[2]+"|"+sa[3]+"|"+sa[4]+"|"+sa[5]+"|"+sa[6]+"|"+sa[7]; mc.dout.writeUTF(msg_out);//通知数据库增加订单
mc.dout.flush();//2014-5-3增加否则无法收到返回信息
// Thread.sleep(2000);//!防止客户端无法收到返回信息,出现异常退出
//对应服务器数据库处理sql执行后返回消息后暂停1秒,? String replay1=mc.din.readUTF()+"|"+sa[1]; if (replay1.startsWith("<#ADD_DINGD_SUCCESS#>")){
replay=replay+"|"+sa[1];}
}// end if getState()==0
i++; }
return replay; } catch (Exception e) {
Log.e(TAG, e.getMessage()); }
return null;
} /**onProgressUpdate方法用于更新进度信息 */
@Override
protected void onProgressUpdate(Integer... progresses) {
Log.i(TAG, "onProgressUpdate(Progress... progresses) called");
// MyUtil.showToast(OrderActivity.this,"第"+ progresses[0]+"个菜开始配送");
// progressBar.setProgress(progresses[0]);
// textView.setText("loading..." + progresses[0] + "%");
//totalText.setText("ok");
} /**onPostExecute方法用于在执行完后台任务后更新UI,根据后台下单结果重新绑定前台订单 */
@Override
protected void onPostExecute(String result) {
Log.i(TAG, "onPostExecute(Result result) called");
String [] sa =result.split("\\|"); int count;
count=sa.length;//取长度
// count= Integer.valueOf(sa[0]);
// MyUtil.showToast(OrderActivity.this, String.valueOf(count));
for(int i=1; i<count; i++){ new OrderDetailManager(OrderActivity.this).updateState_new(0,1,Integer.parseInt(sa[i]));//第三参数为记录ID
bindOrderDetails();
} MyUtil.showToast(OrderActivity.this, "下单完毕");
button_order_submit.setEnabled(true); } //onCancelled方法用于在取消执行中的任务时更改UI
@Override
protected void onCancelled() {
Log.i(TAG, "onCancelled() called");
// textView.setText("cancelled");
// progressBar.setProgress(0); // execute.setEnabled(true);
// cancel.setEnabled(false);
}
} /** end XiadTask*/
2.无wifi网络信号时怎么异常了,哦,提交前应检查网络(代码略);
3.无法更新UI界面,要使用AsyncTask(代码略);
4.菜的图片需要更新怎么办,从后台下载到本地资源文件更新;
5.客户买单结帐处理,后台管理程序处理订单打印、结帐...
6.客户买单后,怎么APP的数据没变,哦,查询时应根据后台数据更新本地数据.....
好了,系统可以交付使用了
app:(台桌订单信息、菜谱更新等功能)
1.登录界面
2.菜谱界面
订单明细
台桌查询界面
二、后台(WebJ2EE服务器、及delphi XE5编写的管理程序)
收银台及订单监控、打印
数据中心
安装
以win7 64机器为例
一、后台
1. 安装sdk ,jdk-8u45-windows-i586.exe(32位)
2. jdk: 环境变量设置
0.) JAVA_HOME jdk1.7.0_25
1.)path -> jdk1.7.0_25\bin;
2.)classpath
.;%Java_home%\jre\lib\rt.jar
3. TOMCAT: 设置环境变量设置
1.)TOMCAT_HOME -》D:\apache-tomcat-6.0.37
2.)webapps 目录放置rmealserv.war
3.)bin目录运行startup.bat
4. 安装32位ODBC mysql-connector-odbc-5.2.6-win32
C:\Windows\SysWOW64\odbcad32.exe 设置odbc,rmealdb
5.安装Mysql 数据库(见本博客)
6. 登录http://127.0.0.1:8080/rmealserv 测试
(完)
平板点餐软件编程体会---记我的Android编程之路的更多相关文章
- 15_Python模块化编程_Python编程之路
之前跟大家讲的是一些python的数据基础,从这篇文章开始,我们开始正式学习python的模块化编程 下面我们解释一下什么叫做模块 之前已经讲过怎么去定义一个方法,如果你是用python交互器(自带交 ...
- 中兴软件编程规范C/C++
Q/ZX 深圳市中兴通讯股份有限公司企业标准 (设计技术标准) Q/ZX 04.302.1–2003 软件编程规范C/C++ 20 ...
- http://www.jb51.net/list/list_233_2.htm(导航: 首页 >> 软件编程 >> Android)
日期:2015-04-24理解Android中Activity的方法回调 日期:2015-04-24Android获取手机通讯录.sim卡联系人及调用拨号界面方法 日期:2015-04-24And ...
- Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结
Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结 Coolshell 称号.理论与c++ 阮一峰:: 理论高手与js高手 王银:理论高手 赵劼,网名老赵,c#高手 与理 ...
- php用什么软件编程
准备好好学习学习PHP了吗?那么你首先应该考虑用什么开发工具(IDE).市面上有很多这类工具,收费的有,免费的也有,选择起来并不轻松. 如果你说PHP编程用基础的文本编辑软件就可以了,比如用记事本.是 ...
- hdl - 软件编程与硬件建模
https://mp.weixin.qq.com/s/Y75I9e3s4fDPZuv-CyiNDA 介绍软件编程思维与硬件建模思维的不同与相似之处. 1. 软件编程思维 编程,意 ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...
- 停车场管理软件附带源代码 J2EE服务端+android客户端
该源码是停车场管理软件附带源代码 J2EE服务端+android客户端,也是一套停车场管理车辆进出的管理软,喜欢的朋友可以看看吧. 应用的后台管理主要功能介绍:1 机构管理 ,机构有从属管理< ...
- 假防病毒软件从电脑移植到了 Android 平台
以前有位女研究生点击网络钓鱼的链接.随即出现实时扫毒画面的方式,接着呈现了扫毒结果,跑出十余笔病毒数据,记录了被感染的计算机的具体位置,并提示她必须更新防病毒软件,而她在付费两千元后收到"防 ...
随机推荐
- .Net Core应用搭建的分布式邮件系统设计
本篇分享的是由NetCore搭建的分布式邮件系统,主要采用NetCore的Api和控制台应用程序,由于此系统属于公司的所以这里只能分享设计图和一些单纯不设计业务的类或方法: 为什么要在公司中首例采用N ...
- 用css3过滤做遮罩效果
<!DOCTYPE html><html ng-app="myApp" ng-controller="myController">< ...
- Building Particle Filters and Particle MCMC in NIMBLE
This example shows how to construct and conduct inference on a state space model using particle filt ...
- 【charger battery 充電 充電器 電池】過充保護警告訊息 over charging protection,Battery over voltage protection, warning message
Definition: over charging protection.battery over voltage protection, 是一種 battery 保護機制, 避免 battery 充 ...
- JVM的内存区域划分以及垃圾回收机制详解
在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...
- 如何通过JS实现简单抖动效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- ABP入门系列(18)—— 使用领域服务
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写.特别是当遇到DDD中一些概念术语的 ...
- Java中关键词之this,super的使用
一.this关键词介绍. 说明:该知识点仅仅限于本人对其了解的范围. package com.study.java.oop; /** * 核心点:"this是指向对象本身的一个指针" ...
- Spring Task每次都会调用两次的问题
最近一个Spring Mvc的项目中需要定时执行一个任务,所以使用了spring 自带的Task功能.本地调试的时候一切都正常,可是部署到服务器上后,每次任务都会被调用两次.在网上搜索了相关的问题,排 ...
- C++构造函数(二)
本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...