1.HttpURLConnection连接URL
1)创建一个URL对象

URL url = new URL();

2)利用HttpURLConnection对象从网络中获取网页数据

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3)设置连接超时

conn.setConnectTimeout(6*1000);

4)对响应码进行判断

if (conn.getResponseCode() == 200){    //从Internet获取网页,发送请求,将网页以流的形式读回来

  //返回网页取出的数据

}else{

throw new RuntimeException("请求url失败");

}

5)得到网络返回的输入流

InputStream is = conn.getInputStream();
6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
7)conn.disconnect();

总结:
--记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
--返回的响应码200,是成功.
--在Android中对文件流的操作和JAVA SE上面是一样的.
--在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
--操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
--对文件流操作完,要记得及时关闭.

下面是根据前天的案例改写的:

前期准备一个web项目

效果如图:

MyTask.java

 package com.example.threadasynctask;

 import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder; import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView; /**
* 生成该类的对象,并调用execute方法之后
* 首先执行的是onProExecute方法
* 其次执行doInBackgroup方法
* @author Administrator
*
*/
public class MyTask extends AsyncTask<Integer, Integer, String>{ private TextView textView;
private ProgressBar progressBar;
//private String str; private String errorMessage = "";
private static final String URL_STR = "http://10.0.2.2:8080/android2016/test.jsp";
private String lastId = "love"; public MyTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar; } /**
* 这里的Integer参数对应AsyncTask中的第一个参数
* 这里的String返回值对应AsyncTask的第三个参数
* 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度
* 1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务)
* 2.绝对不能碰UI
*/
@Override
protected String doInBackground(Integer... params) { try{
//1 、创建一个URL对象
URL url = new URL(URL_STR);
//2)利用HttpURLConnection对象从网络中获取网页数据
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//对连接进行配置
//conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
//防止读取脏数据
conn.setUseCaches(false); //3)设置连接超时
//conn.setConnectTimeout(6*1000); //获取一个输出流
OutputStream os = conn.getOutputStream();
//可以上传文本数据
DataOutputStream dos = new DataOutputStream(os);
dos.writeBytes("id="+URLEncoder.encode(lastId, "UTF-8"));
//dos.writeBytes("lastId="+lastId);
dos.flush();
dos.close(); //4)对响应码进行判断
Log.d("bug", conn.getResponseCode()+"");
if (conn.getResponseCode() == 200){
//从Internet获取网页,发送请求,将网页以流的形式读回来 //5)得到网络返回的输入流
InputStream is = conn.getInputStream();
//reader(注意UTF-8读)
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null; //多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ( (ReadOneline=br.readLine())!=null ){
sb.append(ReadOneline); }
br.close();
isr.close();
is.close();
conn.disconnect();
return sb.toString(); //6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
//7)conn.disconnect();
}else{
errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")";
return "errorserver";
}
}catch (Exception e) {
errorMessage = e.getMessage();
return "errorclient";
} /*int i = 0 ;
for(i = 0 ; i <= 100 ; i++){
str = i+"%"; //模拟加载数据
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i); //返回前端
return i + params[0].intValue() + ""; }*/
} //准备,该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
protected void onPreExecute() {
textView.setText("开始执行异步线程");
} //做完后执行
/**
* 这里的String参数对应AsyncTask中的第三个参数
* (也就是接收doInBackground的返回值)
* 在doInBackground方法执行结束之后在运行,
* 并且运行在UI线程当中 可以对UI空间进行设置
*/
@Override
protected void onPostExecute(String result) {
//textView.setText("异步操作执行结束" + result);
if ("errorclient".equals(result)){
if (errorMessage.indexOf("No add")!=-1){
textView.setText("网络不通");
}
else{
textView.setText("访问网络时其它异常:"+errorMessage);
} }else if("errorserver".equals(result)){
textView.setText(errorMessage);
}else{
textView.setText(result);
}
} }

注意:因为我是访问电脑的Tomcat服务器,在web端时可以用http://localhost:8080/android2016/test.jsp?id=1访问到网页,但是

  在J2ee应用开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务。

  如果在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到tomcat上部署的服务。

  可想而知:Android底层是Linux内核,Android本身就是一个操作系统

  因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是 Android模拟器(Android虚拟机),

  而并非不是你的电脑。这也是你在模拟器中使用localhost时会报“找不到网页”的原因。

在Android操作系统中,将本地电脑的地址映射为10.0.2.2;因此,只需要将原先的localhost或者127.0.0.1改成10.0.2.2,就可以在模拟器上访问到tomcat以及部署在tomcat上的资源和服务。
 

地址可以是外部网哦!!

下面给大家展示一下模拟器效果图:

  

  

Android之HttpURLConnection的更多相关文章

  1. android之HttpURLConnection(转)

    android之HttpURLConnection 1.HttpURLConnection连接URL1)创建一个URL对象 URL url = new URL(http://www.baidu.com ...

  2. Android HttpClient HttpURLConnection相关介绍

    Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...

  3. android 之HttpURLConnection的post,get方式请求数据

    get方式和post方式的区别: 1.请求的URL地址不同: post:"http://xx:8081//servlet/LoginServlet" get:http://xxx: ...

  4. Android使用HttpURLConnection通过POST方式发送java序列化对象

    使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...

  5. Android利用HttpURLConnection实现模拟登录

    最近在做一个APP,需要模拟登录教务处,之前曾经用HttpClient做过,点这里,但是发现最新的Android SDK已经不支持Httpclient了,所以只好在琢磨一下HttpURLConnect ...

  6. android 使用HttpURLConnection方式提交get/post请求

    源码链接 package com.zhangbz.submitdata.Utils; import java.io.ByteArrayOutputStream; import java.io.IOEx ...

  7. 转-Android联网 — HttpURLConnection和HttpClient选择哪个好?

    http://www.ituring.com.cn/article/199619?utm_source=tuicool 在Android开发中,访问网络我们是选择HttpURLConnection还是 ...

  8. Android使用HttpURLConnection下载图片

    讲到http就必须要了解URI和URL URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符 ...

  9. Android中HttpURLConnection对象是怎么生成的

    try { URL mUrl = new URL("https://www.jianshu.com/"); HttpURLConnection http = (HttpURLCon ...

随机推荐

  1. ASP.NET 服务器控件的生命周期

    服务器控件生命周期简介 服务器控件的生命周期是创建服务器控件最重要的概念.作为开发人员,必须对服务器控件生命周期深刻理解.当然,这不是一朝一夕就可以做到的.对于学习控件开发技术的初学者,可以不必掌握得 ...

  2. xfce4 启用回收站

    Userspace virtual filesystem implemented as a pluggable module for gio # pacman -S gvfs

  3. 利用MyEclipse自动生成POJO和配置文件

    1.选择MyEclipse菜单的window菜单的Open Perspective,选择MyEclipse Database Explorer,如图所示. 2.在MySql上面点击右键,选择eidt. ...

  4. 剑指Offer:面试题34——丑数(java实现)

    问题描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路1: ...

  5. 对于大批量赋值功能,使用if判断是否能提高性能

    场景: 如果对某变量进行赋值,是否需要判断一下,如果相等就不用赋值,这样会不会提高性能. 代码如下: "; "; , x2=, x3=; Stopwatch w = new Sto ...

  6. 线程Thread

    一.线程: 程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段 进程:一旦程序运行起来,就变成了操作系统当中的一个进程 线程:程序当中一条独立执行的线索 二.线程的五大状态 新生    就绪 运行 ...

  7. KETTLE实现数据的删除和更新

    一.实现目标 源数据库的数据更新或者删除之后,目标数据库的数据跟着更新或删除,整体流程截图如下: 一.准备工作 源数据库ORACLE  目标数据库MongoDB,在源数据库添加删除.更新触发器 二.操 ...

  8. 冲刺一 (Day 2)

    冲刺一 (Day 2) 小组讨论结果 经过今天的小组会议,小组各成员决定先进一步探讨项目的需求.因为我们明白要砍倒一棵树,磨刀才是前期的重中重之重,实际中也有不少以为前期需求没做好而,在项目后期推翻重 ...

  9. 1、Python环境安装部署

    一.环境准备 1.下载Python安装包(至官方网站) https://www.python.org/downloads/ 建议下载安装最新版 2.设置"环境变量" "我 ...

  10. Modified Least Square Method and Ransan Method to Fit Circle from Data

    In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to f ...