2011-06-09 23:50:00 kobeyxyx 阅读数 2517
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19503 人正在学习 去看看 任苹蜻

       最近进入一家新公司,这家公司是做手机软件开发的。现在自己是试习期,主要任务是看书。看了有一个月了实在是无聊,就想做个手机软件来玩玩。想到之前看到一篇报道,台湾有家餐饮公司用IPAD给客户自助点餐。我就想再android系统上做一下。想了也有一个多星期了,准备开始开工了。

      系统主要是四个模块。顾客端,系统管理端,厨师端,数据库端。它们的主要流程如下:

      其他的系统分析之后会发上来,询问各位的意见

2014-03-10 16:56:52 sunny15100 阅读数 864
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19503 人正在学习 去看看 任苹蜻
我有android开发应用详解第十八章的无限点餐系统的源码,但属于菜鸟一个,今年毕设是无线点餐系统,运行不成功啊,请各位大侠帮帮忙,教教怎么运行。android客户端是打开了,但是后台该怎么开,以前没有接触到servlet,不知道怎么用后台啊。源码地址:http://download.csdn.net/detail/sunny15100/7018439,拜托啦。
2014-03-09 19:52:49 jason0539 阅读数 17309
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19503 人正在学习 去看看 任苹蜻

今天开始做的,由于是根据以前的一个小项目改的,不是从头做的,所以没法把所有代码共享,就在这里记录一下每天的思路,希望能给需要的同学抛砖引玉。

思路其实就是上一篇博客的内容,完善了一下代码,实现了从android发送一句话给服务器,然后服务器把这句话再发回来。

能够实现这样的正常通信,后面的工作应该不会太难。下面开始贴些主要的代码。

首先是服务器端,用了两个类,一个MyServer,处理android发来的消息;一个ServerThread,MyServer每接受到一个用户请求,就开启一个ServerThread去处理。

MyServer:

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

	ServerSocket server = null;

	public MyServer() {
		this.startServer();
	}

	void startServer() {
		int i = 0;
		try {
			server = new ServerSocket(8888, 3);
			System.out.println("==========start===========");
			while (true) {
				Socket socket = server.accept();
				i++;
				System.out.println("第" + i + "个用户连接成功!");
				new Thread(new ServerThread(socket)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


端口号写死的为8888。

ServerThread:

package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ServerThread implements Runnable {

	private Socket socket;

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	// 任务是为一个用户提供服务
	@Override
	public void run() {
		try {
			try {
				// 读取客户端传过来信息的DataInputStream
				DataInputStream in = new DataInputStream(
						socket.getInputStream());
				// 向客户端发送信息的DataOutputStream
				DataOutputStream out = new DataOutputStream(
						socket.getOutputStream());
				while (true) {
					// 读取来自客户端的信息
					String accpet = in.readUTF();
					System.out.println(accpet);
					out.writeUTF("服务器:" + accpet);
				}
			} finally {// 建立连接失败的话不会执行socket.close();
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

线程开始后一直接受客户端发来的消息,然后返回给客户端。

 

以上是服务器端的内容,能够同时处理多个用户的请求。

下面是android客户端的代码。

MainActivity:

package jason.smartdinner;

import serverhelper.ClientHelper;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
	public static final String TAG = "MAINACTIVITY";

	void log(String msg) {
		Log.d(TAG, msg);
	}

	TextView output;
	EditText input;
	Button send;
	ClientHelper clientHelper;
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Bundle b = msg.getData();
				String msg2 = b.getString("update");
				log(msg2);
				output.setText(msg2);
				break;
			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Thread() {
			public void run() {
				clientHelper = new ClientHelper();
			}
		}.start();
		output = (TextView) findViewById(R.id.output);
		input = (EditText) findViewById(R.id.input);
		send = (Button) findViewById(R.id.send);
		send.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new Thread() {
					@Override
					public void run() {
						// TODO Auto-generated method stub
						super.run();
						String message = input.getText().toString();
						clientHelper.send(message);
						String receive = clientHelper.read();
						log(receive);
						Message update = new Message();
						update.what = 1;
						Bundle bundle = new Bundle();
						bundle.putString("update", receive);
						update.setData(bundle);
						handler.sendMessage(update);
					}
				}.start();
			}
		});
	}

}


大家会注意到里面我用了好几个线程,这里需要注意的是,android的网络连接请求不能再主线程里,否则会报错android.os.NetworkOnMainThreadException

所以每个涉及网络连接的都新开了线程去处理。其他就简单了,处理下界面更新。

ClientHelper:

package serverhelper;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import android.util.Log;

public class ClientHelper {
	
	public static final String TAG = "CLIENTHELPER";
	void log(String msg){
		Log.d(TAG, msg);
	}
	
	DataInputStream in;
	DataOutputStream out;
	Socket socket = null;

	public ClientHelper() {
		try {
			socket = new Socket("192.168.1.100", 8888);
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void send(String msg) {
		try {
			out.writeUTF(msg);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String read() {
		String accept = "未接收到信息";
		try {
			accept = in.readUTF();
			log(accept);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return accept;
	}
}


这个就是负责与服务器交互的类,发送和接受数据两个方法。其中socket的ip地址是我电脑的本地ip,上篇博客里有提到。

代码就先不上传了,基本上设计到的都在上面贴出来了,细心看看就明白了,完全可以自己搞出来。

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

2016-07-29 09:16:53 minggelo 阅读数 183
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19503 人正在学习 去看看 任苹蜻
Android平台的无线点餐系统
( 下载地址:http://pan.baidu.com/s/1hsFcGU4 密码:bjfr )

第一讲.项目背景及功能演示
第二讲.框架设计及实体类JAR包说明
第三讲.首页ViewFlipper手势滑动效果实现
第四讲.登录前台UI界面设计
第五讲.登录后台服务器端代码实现
第六讲.服务器端用户登录Servlet的封装
第七讲.客户端用户登录功能实现
第八讲.利用JSON+HttpPost实现用户注册
第九讲.后台员工管理_添加员工信息(1)
第十讲.后台员工管理_添加员工信息(2)
第十一讲.后台员工管理_修改员工信息(1)
第十二讲.后台员工管理_添加员工信息(2)
第十三讲.后台菜系管理_添加菜系(1)
第十四讲.后台管理_菜系类别管理
第十五讲.后台菜系管理_添加菜系(2)
第十六讲.利用jspSmartUpload组件实现后台食品管理图片上传功能
第十七讲.后台管理-食品添加Client端实现(1)
第十八讲.后台管理-食品添加Client端实现(2)
第十九讲.后台菜品管理+预订管理Servlet实现核心代码讲解
第二十讲.会员预订_点菜_并桌_转桌_换桌核心功能实现讲解
第二十一讲.会员下单_结账_退单等核心功能实现讲解
2016-11-28 22:38:35 qq_15062527 阅读数 2006
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19503 人正在学习 去看看 任苹蜻

本章将介绍一些在开发中用到的一些常用且值得介绍的Android 基础知识和技术,包括FragmentSlidingmenuRecyelerViewHelloCharts框架和Ormlite框架。

 



Fragment

设计中包括添加菜品界面、顾客点餐界面、数据统计界面等几乎所有的界面均使用Fragment来构建。

“Fragment”是中文“片段,碎片”一意思。Android系统由于其开源的特性,在短时间内拥有了大量的设备支持,不同的设备拥有不同的屏幕尺寸,为了令一应用可以更容易地适配不同设备,Google设计出了Fragment机制。Fragement必须依附Activity而存在,生命周期也依托在Activity的生命周期之上。ActivityFragment生命周期依附关系对照图见下图



ActivityFragment生命周期依附关系对照图


Frgment有两种使用方法。一种是直接将Fragment当成普通控件直接写在Activity的布局文件中,然后继承Fragment类,重写onCreateView方法进行设置和调用。一种是使用FragmentManager方法对Fragment进行动态加载,这种方法因为其连接性及灵活性,结合本设计的应用场景,本设计在设计中一般选用的是这一种动态加载方法。每切换到一个新的功能界面时,用FragmentTransactionreplace方法将主界面替换成新的fragment,所有功能操作都在新的fragment中进行,保证了功能的流畅性和每个功能界面的独立性。

Fragment切换的代码实现:

 

OrderFragment orderFragment = new OrderFragment();
        FragmentManager fm = getFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        orderFragment.setArguments(bundle);
        transaction.replace(R.id.layout_main, orderFragment);
        transaction.addToBackStack(null);
        transaction.commit();




Slidingmeu


设计中的客户端侧滑菜单使用的是Slidingmenu的实现方式。SlidingmenuAndroid中比较常用的侧滑菜单的实现方式,是GitHub上的一个开源项目,能够在主界面中设置菜单的左侧滑出和右侧滑出,不占用主屏幕的面积,可以极大地运用起设备屏幕的可视化区域。代码托管地址: https://github.com/jfeinstein10/SlidingMenu

Slidingmeun的使用方法主要分为以下几步设置:

1)在使用Slidingmenu时,首先需要新建一个Slidingmenu的对象:

SlidingMenu menuview = new SlidingMenu(this);  


2)设置Slidigmenu的滑出方式,即从左边滑出还是右边滑出:

menuview.setMode(SlidingMenu.LEFT);(从左侧滑出)


3)设置屏幕的触摸模式,即如何触摸时会促发侧滑菜单令其弹出。这个方法提供了三种触摸触发方式,分别是TOUCHMODE_MARGINTOUCHMODE_FULLSCREEN TOUCHMODE_NONETOUCHMODE_MARGIN表示仅从滑出边的边缘触摸时会促发侧滑菜单滑出,TOUCHMODE_FULLSCREEN表示从全拼触摸都会触发侧滑菜单滑出,TOUCHMODE_NONE则表示不管从任何地方触摸侧滑菜单都不会促发侧滑菜单滑出,需要在按钮或其它地方设置相应事件触发侧滑菜单滑出。


4)设置滑动菜单视图的宽度:

menuview.setBehindOffsetRes(R.dimen.slidingmenu_offset);  


5)设置渐入渐出效果的值 :

menuview.setFadeDegree(0.28f);



6)设置所依附的Activity

menuview.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);



7)设置布局

menuview.setMenu(R.layout.leftmenu);  


 

 




 RecyclerView


RecyclerView是一个列表显示控件,用于在有限的界面中显示大量的的数据,可以完美地替代原有的ListViewRecyclerView的框架具有高度耦合的特性,即插即用,用完解耦即可复用,灵活性极强。通过布局管理器LayoutManager,可以设置RecyclerView多种不同的列表显示方式,如横向显示方式、纵向显示方式、瀑布流显示方式等。通过ItemDecoration,可以设置显示项之间的间隔,不仅仅是间隔的距离,还包括间隔的图案样式。通过ItemAnimator,可以设置Item的动画样式,如点击动画、移除动画和滑动动画等。不同的点击事件和滑动事件也可以自定义。

RecyclerView的基本用法:

1)在布局文件中加入RecyclerView控件;

2)写Item布局文件;

3)设置数据适配器,绑定数据;

4)在适配器中对Item等进行设置,包括显示的Item数、显示内容、点击和滑动事件的回调接口等。



HelloCharts


设计中的数据统计界面中的饼状图是使用HelloCharts来实现的。HelloCharts是一个开的源图标库,性能优越,图标完善,UI风格美观且现代化,坐标轴也相当的精细,支持图表的缩放、滑动和平移,拥有简介而流畅的动画效果。HelloCharts支持的图标类型包括:

1)线图(三线,填充线,分散点)

2)柱形图(分组,堆积,负值)

3)饼图

4)气泡图

5)组合图(列/行)

6)预览图(柱形图和直线图)

HelloCharts绘制的柱状图示例如图


 

 用HelloCharts绘制的柱状图

 

 




 Ormlite

设计中的本地数据库操作部分使用的框架是OrmliteOrmlite是一个轻量级的注入式数据库框架,在本设计中用其来进行本地数据库操作代码的编写。通过Ormlite可以十分轻松地建立数据库和表,并对数据进行增删改查等基本的数据库操作。与原生的数据库代码相比,使用Ormlite会更加简便,提高了开发效率,降低了数据库操作的出错率,并且在数据库操作出现错误时,能更快速地找到出问题的地方予以修正。

Ormlite的基本使用方法为:

1)到ORMLite官网下载相应的jar包;

2)在工程文件中导入相应的jar包;

3)按项目自身要求配置对应的Bean类;

4)继承OrmLiteSqliteOpenHelper类编写一个DAO类,DAO类中需要实现数据库项的的创建和更新两种方法。



没有更多推荐了,返回首页