博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android对象巧用Android网络通信技术,在网络上直接传输对象
阅读量:4694 次
发布时间:2019-06-09

本文共 4639 字,大约阅读时间需要 15 分钟。

本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~

    转载请注明出处:

    要做一个优秀的Android应用,使用到网络通信技巧是必不可少的,很难想象一款没有网络交互的软件最终能发展很多成功。那么我们来看一下,一般Android应用程序里都是怎么实现网络交互的,这里拿一个Boook对象为例:

    android和对象

    如上图所示,首先在手机端生成一个Book对象,里头包含书名、作者、价格等数据。为了要将这些数据发送到服务器端,我们要从Book对象中把数据掏出,然后组装成XML格式的字符串。接着通过网络API,把组装好的XML字符串发送到服务器端。服务器端接到了客户端发来的XML字符串,就要对该XML停止解析。然后把解析出的数据重新组装成Book对象,以后服务器端就可以对该对象停止一系列其它的操作了。

    当然XML格式的数据量比较大,当初很多Android应用为了节俭流量,都改用JSON格式来传输数据了。不过不论是使用XML还是JSON,上图中描述的步骤总是少不了的。

    感觉使用这类方式来传输数据,每次封装和解析XML的过程是最繁琐的,那么能不能把这最繁琐的过程绕过去呢?

    android和对象

    如上图所示,如果可以调用网络API,直接把Book对象发送到服务器端,那么全部网络交互过程就会变得非常简单,下面我们就来看看如何实现。

    新建一个Android工程,命名为ClientTest作为客户端工程。这里第一个要肯定的就是待传输的对象,我们新建一个Book类,代码如下:

package com.test;import java.io.Serializable;public class Book implements Serializable {	private String bookName;	private String author;	private double price;	private int pages;	public String getBookName() {		return bookName;	}	public void setBookName(String bookName) {		this.bookName = bookName;	}	public String getAuthor() {		return author;	}	public void setAuthor(String author) {		this.author = author;	}	public double getPrice() {		return price;	}	public void setPrice(double price) {		this.price = price;	}	public int getPages() {		return pages;	}	public void setPages(int pages) {		this.pages = pages;	}}

    这个类就是一个简单的POJO,但是要注意一点,它实现了Serializable接口,如果想在网络上传输对象,那么该对象就一定要实现Serializable接口。

    接下来打开或新建activity_main.xml作为程序的主布局文件,参加如下代码:

    这个布局里头就是包含了一个按钮,点击这个按钮就去收回网络请求。

    接下来打开或新建MainActivity作为程序的主Activity,其中参加如下代码:

    每日一道理
那蝴蝶花依然花开花落,而我心中的蝴蝶早已化作雄鹰飞向了广阔的蓝天。
public class MainActivity extends Activity implements OnClickListener {	private Button send;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		send = (Button) findViewById(R.id.send);		send.setOnClickListener(this);	}	@Override	public void onClick(View v) {		Book book = new Book();		book.setBookName("Android高级编程");		book.setAuthor("Reto Meier");		book.setPages(398);		book.setPrice(59.00);		URL url = null;		ObjectOutputStream oos = null;		try {			url = new URL("http://192.168.1.103:8080/ServerTest/servlet/TestServlet");			HttpURLConnection connection = (HttpURLConnection) url.openConnection();			connection.setDoInput(true);			connection.setDoOutput(true);			connection.setConnectTimeout(10000);			connection.setReadTimeout(10000);			connection.setRequestMethod("POST");			oos = new ObjectOutputStream(connection.getOutputStream());			oos.writeObject(book);			InputStreamReader read = new InputStreamReader(connection.getInputStream());			BufferedReader br = new BufferedReader(read);			String line = "";			while ((line = br.readLine()) != null) {				Log.d("TAG", "line is " + line);			}			br.close();			connection.disconnect();		} catch (Exception e) {			e.printStackTrace();		} finally {		}	}}

    我们可以看到,在onClick方法中处理了按扭的点击事件。这里首先new出了一个Book对象作为待传输数据,接着new出了一个URL对象,指明白服务器端的接口地址,然后对HttpURLConnection的一些可选参数停止配置。接着通过调用ObjectOutputStream的writeObject方法,将Book对象发送到服务器端,然后等服务器端返回数据,最后关闭流和连接。

    注意由于我们使用了网络功能,因此需要在AndroidManifest.xml中参加如下权限:

    好了,现在Android端的代码已开辟完成,我们当初开始来编写服务器端代码。

    新建一个名为ServerTest的Web Project,要做的第一件事就在Web Project下建立一个和Android端一样的Book类。这里有个非常重要的点大家一定要注意,服务器端的Book类和Android端的Book类,包名和类名都必须雷同,否则会涌现类型转换异常。这里由于两个Book类的内容是完全一样的,我就不再重复贴出。

    然后新建一个Java Servlet作为网络拜访接口,我们重写它的doPost方法,具体代码如下:

public class TestServlet extends HttpServlet {	public void doPost(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		ObjectInputStream ois = null;		try {			ois = new ObjectInputStream(request.getInputStream());			Book book = (Book) ois.readObject();			System.out.println("书名是: " + book.getBookName());			System.out.println("作者是: " + book.getAuthor());			System.out.println("价格是: " + book.getPrice());			System.out.println("页数是: " + book.getPages());			PrintWriter out = response.getWriter();			out.print("success");			out.flush();			out.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			ois.close();		}	}	}

    可以看到,我们首先通过调用HttpServletRequest的getInputStream方法获取到输入流,然后将这个输入流组装成ObjectInputStream对象。接下来就很简单了,直接调用ObjectInputStream的readObject方法,将网络上传输过来的Book对象获取到,然后打印出Book中携带的数据,最后向客户端返回success。

    当初我们来运行一下程序,首先将ServerTest这个项目安排到服务器上,并开启服务器待命。接着在手机上打开ClientTest这个应用程序,如下图所示:

                            android和对象

    点击发送收回网络请求,可以看到服务器端打印结果如下:

    android和对象

    而Android端打印结果如下:

    android和对象

    由此我们可以看出,网络上停止对象传输已成功了!不需要通过繁琐的XML封装和解析,我们也成功将Book中的数据完整地从Android端发送到了服务器端。

    好了,今天的讲解到此结束,有疑问的朋友请在下面留言。

文章结束给大家分享下程序员的一些笑话语录: 那是习惯决定的,一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器。历史(软件UI)的进步(改善)不是以个人意志(习惯)为转移的!

--------------------------------- 原创文章 By

android和对象
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/25/3098692.html

你可能感兴趣的文章
Android上使用MP3格式录制声音
查看>>
乐观锁 悲观锁 数据库
查看>>
Openresty - 读取请求体
查看>>
使用RabbitMQ做的一些工作及经验教训
查看>>
动态规划入门
查看>>
mrbs - 初识
查看>>
了解Hadoop和大数据
查看>>
iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#...
查看>>
what's the python之面向对象
查看>>
一些命令行操作时候可以使用的快捷键
查看>>
mysql 安装完以后没有mysql服务
查看>>
用模重复平方法求b^n mod m
查看>>
使用tableExport.js直接导出web页面上的table
查看>>
树链剖分
查看>>
ExecutorService执行器服务介绍
查看>>
EF实体框架之CodeFirst六
查看>>
System.out.println与System.err.println的区别
查看>>
eval(PHP 4, PHP 5)
查看>>
readelf用法小记
查看>>
结对编程进展总结
查看>>