Android实践--Http 客户端编程之GET请求

Android Http 客户端编程之GET

说起Http编程,不尽然想起GET和POST两种请求方式,本文以简洁明了的的步骤和说明,将Android中常用的Http编程的方式列举出来,给刚刚在Android路上起步的奋斗者参考和指引,希望快速上手应用Android Http编程的同仁可以先绕过下面一段话。

做一件事之前,我们是否能驻足想一下要做这件事,我们需要做哪些工作,然后在经验中积累出模板思路和步骤,在程序界通常用设计模式来概括这些工作良好的解决方案。有了这些总结积累,这样我们就能举一反三,面对新的问题不再 无所适从,这是一个优秀程序员必须养成的能力,所以每个爱好编程的同仁都有责任让自己成为一个优秀的程序员程序员。

Android Http 客户端编程设计模式(步骤):

1.网络权限:添加INTERNET用户权限。

2.UI设计:设计用户界面。

3.发出请求:客户端提交HTTP请求,提交数据,切记不能在UI线程完成。

4.接收响应:接收服务器端的响应,获取服务器返回数据。

5.UI更新:客户端业务处理,更新UI。

此模式是我初学Android给自己总结的一套模式,这样能够帮助我在涉及到HTTP编程的时候能够编写出良好工作的代码,欢迎同仁给出宝贵的意见。下面是根据这套模式实现的HTTP编程实践。

1.网络权限,添加用户权限:

    <uses-permission android:name="android.permission.INTERNET"/>

2.UI设计,登陆界面的UI,文本框*1+密码框*1+按钮*1,UI较为简单,布局文件内容略,这个之所以写成中文,后面会有一个中文乱码的问题,为了简化篇幅,此处EditText和Button的Text直接写好,这是一个很不好的编码习惯,强烈建议实际中抽离出来,在string.xml中定义,以此为鉴。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <EditText
        android:id="@+id/et_userName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"
        android:text="袁慎建" />
    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"
        android:text="000" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="loginByGet"
        android:text="GET登陆" />
</LinearLayout>

3.发出请求:编写客户端HTTP请求,并提交数据,中文用户名需要进行URL编码,见代码。(此步骤不能在UI线程进行)

4.接收响应:接收服务器端的响应,请求成功后获取响应输入流。(此步骤不能在UI线程进行)

	public static final String URL_PREFIX = "http://191.168.2.177:8080/LoginServer/LoginServlet";
	/**
	 * Get方式提交请求,此方法只能在非UI线程进行调用
	 *
	 * @param userName
	 * @param password
	 * @return
	 */
	public static String loginByGet(String userName, String password) {
		try {
			// 对中文进行编码
			String path = URL_PREFIX + "?user="
					+ URLEncoder.encode(userName, "UTF-8") + "&pass="
					+ URLEncoder.encode(password, "UTF-8");
			URL url = new URL(path);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5000);
			int code = conn.getResponseCode();
			if (code == 200) {
				InputStream is = conn.getInputStream();
				return readStream(is);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 读取流中数据
	 *
	 * @param is
	 * @return
	 */
	public static String readStream(InputStream is) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] values = new byte[1024];
		try {
			try {
				int length = 0;
				while ((length = is.read(values)) != -1) {
					baos.write(values, 0, length);
				}
				return new String(baos.toByteArray());
			} finally {
				if (baos != null) {
					baos.close();
				}
				if (is != null) {
					is.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
			return "解析失败";
		}
	}

5.UI更新:解析服务器响应输入流数据后,将数据内容Toast显示出来,Android中Activity类中的runOnUiThread方法,适当使用可以简化Handler的编程。

	public void loginByGet(View view) {
		final String userName = etUserName.getText().toString();
		final String password = etPassword.getText().toString();
		if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(password)) {
			Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
			return;
		}
		ExecutorService executorService = Executors.newSingleThreadExecutor();
		executorService.execute(new Runnable() {
			@Override
			public void run() {
				// 调用LoginService中的方法
				final String result = LoginService.loginByGet(userName,
						password);
				/*
				 * 利用这个方法可以方便更新UI,如果当前线程是ui线程,会立即执行,否则会被放到UI线程的事件队列中 Runs the
				 * specified action on the UI thread. If the current thread is
				 * the UI thread, then the action is executed immediately. If
				 * the current thread is not the UI thread, the action is posted
				 * to the event queue of the UI thread.
				 */
				runOnUiThread(new Runnable() {
					public void run() {
						Toast.makeText(getApplicationContext(),
								result + "-------", Toast.LENGTH_LONG).show();
					}
				});
			}
		});
		executorService.shutdown();
	}

通过这篇文章,有没有引发你对HTTP编程的一些思考和总结,当我们要实现HTTP客户端的时候,只需要记住简单的设计模式中的五个步骤,这只是一个简单的GET请求的例子,后面会继续退出此设计模式下的POST请求,以及HTTP一些框架的使用,敬请期待。

文章来源:http://blog.csdn.net/ysjian_pingcx/article/details/25915047

Android实践--Http 客户端编程之GET请求,布布扣,bubuko.com

时间: 2024-08-09 21:46:18

Android实践--Http 客户端编程之GET请求的相关文章

Android实践--Android Http 客户端编程之GET

Android Http 客户端编程之GET 说起Http编程,不尽然想起GET和POST两种请求方式,本文以简洁明了的的步骤和说明,将Android中常用的Http编程的方式列举出来,给刚刚在Android路上起步的奋斗者参考和指引,希望快速上手应用Android Http编程的同仁可以先绕过下面一段话. 做一件事之前,我们是否能驻足想一下要做这件事,我们需要做哪些工作,然后在经验中积累出模板思路和步骤,在程序界通常用设计模式来概括这些工作良好的解决方案.有了这些总结积累,这样我们就能举一反三

网络编程之Http请求头与响应头

(一)概述 上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头: (二)HTTP请求与响应头 这里贴下上一节给出的图,根据下面给出的表,大家自己感受下相关请求头的作用吧: PS:第一行是请求行:请求方式 + 资源名称 + HTTP协议版本号,另外请求头只是给服务端的一个 信息而已或者说一个简单,至于怎么处理,还是由服务端来决定的! HTTP Request Header请求头信息对照表: 2.HTTP响应之响应头: 同

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android编程之Fragment使用动画造成Unknown animation name: objectAnimator异常

在为Fragment做切换动画,启动后遇到了一个异常: Caused by: java.lang.RuntimeException: Unknown animation name: objectAnimator 截图如下: 我的代码如下: fragment = Fragment.instantiate(getActivity(), clz.getName()); fragment.setArguments(args); ft.setCustomAnimations(R.animator.frag

Android多线程编程之Handler篇(消息机制)

Android多线程编程之Handler篇(消息机制) Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue 消息队列,以队列的形式(实为单链表结构)对外提供插入和删除的工作, Looper 以无限循环的形式不断获取MessageQueue中的消息,有则处理,无则等待. ThreadLocal ThreadLocal可以在不同的线程互不干扰的存储并提供数据,通过ThreadLocal可以很

Android编程之LayoutInflater的inflate方法实例

假设你不关心其内部实现,仅仅看怎样使用的话,直接看这篇就可以. 接上篇,接下来,就用最最简单的样例来说明一下: 用两个布局文件main 和 test: 当中,main.xml文件为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo

android网络编程之pull解析xml

android网络编程之pull解析xml 除了前面介绍过的SAX以及DOM方法,还可以通过Pull对xml文档进行一个解析.Pull解析器的解析方式与SAX非常相似.它提供了类似的事件,使用parser.next()可以进入下一元素并触发相应事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行选择,然后进行相应的处理,调用parser.nextText()方法可以获取下一个Text类型元素的值. pull解析器特点: *结构简单:一个接口.一个例外.一个工厂就组成了P

网络编程之TCP客户端开发和TCP服务端开发

开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': # 创建tcp客户端套接字 # 1. AF_INET:表示ipv4 # 2. SOCK_STREAM: tcp传输协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服务端应用程序建立连接 tcp_c

一次没有最后期限的编程之旅

今年上半年,是我工作以来最繁忙的六个月,总之遇到了最艰难的教程.最冗长的文档.最繁琐的代码以及最窘迫的合作,最终的极度疲劳成了压垮了我的最后一根稻草. 那年杭州,接连40摄氏度以上的连续高温,忽然一天39度,竟然觉得整个世界都清凉了.人,就是这么犯贱,稍有舒缓,便全然忘记曾经的抓狂. “写一个Apple Watch APP玩玩”,忽然闪过这么一个念头.这对执着于<证明论>和<集合论>的苦行者而言,浮现的不过是一次短暂的旅行. 旅行,不是迁移,抑或流浪,终究是要回归的. 记得还是在2