nputStream content = entity.getContent();
convertStreamToString cStreamToString=new convertStreamToString();
String returnConnection = cStreamToString.convertStreamToString(content);
if (returnConnection.equals("Yes")) {
Log.i("System.out", name+password);
}else {
Log.i("System.out","fail");
}
} catch (Exception e) {
e.printStackTrace();}} }).start(); 当用户成功登陆后需要将信息传递给服务器端,然后通过服务器端PHP文件对数据进行处理,然后将数据输出,客户端再获取服务器端的输出信息,进行处理后在合适的位置进行输出显示,以便用户了解信息,查询商户列表代码如下表5-1-2所示。
表5-1-2 后台获取商户列表代码
include 'daconnect.php';
$b=array();
$q=mysqli_query($con, "SELECT * FROM `seller`");
while ($e=mysqli_fetch_assoc($q)){
$b[]=$e;
}
echo json_encode($b);
mysqli_close($con); 其中daconnect.php是链接数据库的文件,如果链接成功才能对数据库进行增删改查等操作。其中的详细链接代码如图5-1-2所示:
图5-1-2:后台数据库连接代码
为了实现用户在同一手机上,一次登录不再重复登录,采用的是SharePreference 对登录数据进行保存,从而可以实现用户一次登陆成功后,下次再打开软件直接进入而不用再次重复登录,方便用户使用软件。其中方法使用的代码片段如下图5-1-3所示:
图 5-1-3 本地用户保存代码
5.1.2软件"抽屉"效果
本蔬菜宝手机APP主要有订菜,查看订单,发现信息,收藏,搜索等功能其中系统采用左拉抽屉效果对APP进行布局管理,有整体效果图我们可以清晰的使用软件,并选择自己想要的功能,当然这一切的前提是用户认证完毕后才可以使用,否则将会一直提醒用户登录,当然用户只需登录一次就好,在这里我才用的是sharedPreference对用户是否登录,具体详见代码。其软件的整体效果图如图5-1-4所示:
图5-1-4:抽屉效果图
通过使用抽屉效果我们可以实现更加人性化的对软件的功能进行布局,用户可以通过左拉,拉出功能列表,用户可以直接点击,从而进入软件的功能,更加方便用户对软件的使用,也使软件的功能布局更加合理。要实现抽屉效果首先要掌握frament的替换,点击某个功能后,应该调出属于该功能的frament,替换掉原来的frament,具体实现代码如下图5-1-5所示。
图5-1-5 frament替换代码片段
5.1.3购菜功能
软件的主要主要功能是实现购菜,但购菜就必须按选择商家,选择菜品,进行结算等,在软件中用户可以对自己想买的蔬菜进行合理选择, 用户购物界面如表5-1-3下,其中图图5-1-6是用户选择商家,选择自己放心的商家是购买蔬菜的第一步,用户选择商家后会进入商家界面如图图5-1-7,在这里你可以收藏自己喜欢的商家,以便下次方便购买,另外你可以选择自己所要的蔬菜品种,这里用到了自定义控件,详情见详细代码,选择后如果能够满足起送价,可以进入计算方面,如图图5-1-8,支付成功会跳转到首页,否则进入订单界面。
表5-1-3购买功能图
图5-1-6商家单
图5-1-7蔬菜单
图5-1-8结算单 其中的难点是异步加载蔬菜图片代码片段使用AsyncTask可以进行异步网络图片的加载,期中doInBackground()是进行网络操作,onPostExecute()是进行UI操作,这个有效的解决了前文中提到的Android4.0以后需要另起新进程进行网络操作的难题。在本APP中多次使用此方法,但要注意的是对象只能执行一次。如表5-1-4所示:
表5-1-4 异步加载实现代码片段
private void asyncloadImage(ImageView iv_header, String path) {
AsyncImageTask task = new AsyncImageTask(iv_header);
task.execute(path);
}
private final class AsyncImageTask extends AsyncTask
{
private ImageView iv_header;
public AsyncImageTask(ImageView iv_header) {
this.iv_header = iv_header;
}
protected Bitmap doInBackground(String... params) {
HttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(params[0]);
final Bitmap bm;
try {
HttpResponse hr = client.execute(httpPost);
bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
} catch (Exception e) {
return null;
}
return bm; }
protected void onPostExecute(Bitmap result) {
if (iv_header != null && result != null) {
iv_header.setImageBitmap(result);
} } 此外为了更好的布局Item在这里需要用XML对信息的显示位置进行规定,其中index.xml对首页进行布局,在这里面定义了两个控件分别是Textview,用于显示标题,例如"购物单"之类的定值,另一份为ListView用于列表显示从服务器端获取的信息,例如:商家列表和蔬菜列表等,但为了正确美观的显示Listview中每行的数据必须对Item进行布局限定,在程序中的Item.xml这里面也有几个用于显示内容的控件,除了Imageview用于上面代码的异步加载图片外,也用到了add_sub控件,这个控件用于显示选择蔬菜数量的加减,其效果图5-1-9所示如下:
图5-1-9 Item 效果图及解释
当用户选择完毕且订单总额满足起送价后用户可以提交订单并进行支付,这里是将订单信息传递给服务器端的order_add.php文件,该文件是获取APP中的信息并将其处理后获取有关订单相关的信息,然后连接数据库,并将获取的从APP中获取的关于订单相关的数据插入到order和order_detail表中。由于插入第二张表时需要用到第一次插入order表的o_id,我采用的是通过$id=mysqli_insert_id($con);来获取$con连接上一次插入的ID,值得注意的是该数据库中ID必须是自增时才可以正确获得,否则将会获得恒"0"。要判断语句是否成功执行以方便对用户做出提示,这里采用mysqli_affected_rows($con)来进行判断如果其>0则,SQL语句成功执行,否则提示执行失败,请重新选择之类的,具体PHP代码如下图5-1-10所示。
图5-1-10 SQL语句判读是否执行
PHP语句输出后可以通过手机端新起进程接收PHP文件的输出信息,然后将输出信息转换成字符串形式,通过判断输出字符串的内容判断手机客户端发送的内容是否成功执行,下表为上图代码的接收代码cStreamToString为自定义,用于将输出结果转换成字符串。
表5-1-5 Android端接收PHP文件代码
new Thread(new Runnable() {
public void run() {
Map parmas = new HashMap();
parmas.put("name", name);
DefaultHttpClient client = new DefaultHttpClient();//http客户端
HttpPost httpPost = new HttpPost("10.0.3.2/test/post.php");
ArrayList pairs = new ArrayList();
pairs.add(new BasicNameValuePair("name", name));
pairs.add(new BasicNameValuePair("password", password));
try {
UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(pairs, "utf8");
httpPost.setEntity(p_entity);
HttpResponse response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
convertStreamToString cStreamToString=new convertStreamToString();
String returnConnection = cStreamToString.convertStreamToString(content);
if (returnConnection.equals("Yes")) {
Log.i("System.out", name+password);
上一篇:移动端APP应用开发课程论文
下一篇:电咖汽车入选2018独角兽企业榜百强 发布“天际”品牌将推高估值