什么是HTTP协议:
超文本传送协议(HTTP-Hypertext transfer protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transfer-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
HTTP协议的主要特点:
<1.支持客户/服务器模式
<2.简单快速:客户像服务器请求服务时,只需要传送请求方法和路径。请求方法常用GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,是的HTTP服务器的程序规模较小,因而通信速度快。
<3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
<4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
<5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
工作流程:
一次HTTP操作称为一个事务,其工作过程可分为四步:
<1.首先客户机与服务器需要建立连接,只要单机某个超级链接,HTTP的工作开始。
<2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:同一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
<3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
<4.客户端接收服务器所返回的信息通过浏览器显示在用户的屏幕上。然后客户机与服务器断开连接。
HTTP协议永远是客户端发起请求,服务器回送响应,这样就限制了使用HTTP协议,即无法实现在客户端没有发送请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。
URL:
统一资源定位符(UniformResourceLocator)也被称为网页地址,是因特网上标准的资源的地址。
URL的格式由下列三部分组成:
<1.协议(或称为服务方式)
<2.存有该资源的主机IP地址(有时也包括端口号)
<3.主机资源的具体地址,如目录和文件名等
如http://www.google.con/index.jsp
SYN(synchronous)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发送一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
ACK(Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发出来的数据已确认接收无误。
OSI(Open System Interconnection):开放系统互连模型(七层参考模型),OSI参考模型将整个网络通信的功能划分为七个层次,由低到高分别是物理层(PH)、数据链路层(DL)、网络层(N)、传输层(T)、会话层(S)、表示层(P)、应用层(A)。每层完成一定的功能,每层直接为上层提供服务,并且所有层次都互相支持。第四层到第七层主要负责互操作性,第一层到第三层用于创造两个网络设备间的物理连接。
TCP/IP四层协议:主机到网络层---网络层---传输层(tcp、udp)---应用层(ftp、telnet)
http请求的方式:
<1.GET 请求获取Request-URI所标识的资源
<2.POST 在Request-URI所标识的资源后附加新的数据
<3.HEAD 请求获取由Request-URI所标识的资源的响应消息报头
<4.PUT 请求服务器存储一个资源,并用Request-URI作为其标识
<5.DELETE 请求服务器删除Request-URI所标识的资源
<6.TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
<7.CONNECT 保留将来使用
<8.OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项
什么是JSON格式:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是基于JavaScript的一个子集。
HttpUrlConnection:
访问网络:
Mainfest添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
activity_main.xml添加WebView
自定义Http类为子线程访问网页
public class Http extends Thread {
private String url;
private WebView webView;
//由于需要更新UI,固声明Handler
private Handler handler;
//创建构造函数并指定参数
public Http(String url, WebView webView, Handler handler) {
//初始化
this.url = url;
this.webView = webView;
this.handler = handler;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
try {
//创建HttpUrlConnection对象,httpurl对象调用openConnection方法以对url进行http的访问
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
//设置请求超时时间
conn.setReadTimeout(5000);
//设置网络请求方式
conn.setRequestMethod("GET");
//创建一个StringBuffer作为缓冲
final StringBuffer sb = new StringBuffer();
//创建一个包装类,通过getInputStream方法拿到读入流,并把字符流转换为字节流。
BufferedReader reader = new BufferedReader(new InPutStreamReader(conn.getInputStream()));
String str;
while ((str=reader.readLine())!=null){
//通过append方法向StringBuffer添加数据
sb.append(str);
}
handler.post(new Runnable() {
@Override
public void run() {
webView.loadData(sb.toString(),"text/html;charset=utf-8",null);//数据,数据类型,编码
}
});
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private WebView webView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView1);
//建立一个线程
new Http("http://www.lofter.com/login?urschecked=true",webView,handler).start();
}
}
运行程序会出现E/eglCodecCommon: **** ERROR unknown type 0x73000d (glSizeof,80),这个问题没有解决。。但它并不影响程序运行,网上查了下基本说是可以忽略,大家有解决办法请留言谢谢~
通过get()传递参数给服务器:(发送数据量较小可用,通常几KB,并且发送的信息以Url显示出来不是很安全全全)
服务器搭建(eclipse j2ee)
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="MyServlet" method="get">
name:<input type= "text" name="name"><br>
code:<input type="text" name="code"><br>
submit:<input type="submit" value="submit"><br>
</form>
</body>
</html>
MyServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String code = request.getParameter("code");
PrintWriter out = response.getWriter();
//指定响应头文本类型
response.setContentType("text/htm);;charset=utf-8");
//中文输入会出现乱码,name 设置字符转码 new String(name.getBytes("iso-8859-1"),"utf-8")
out.print("name="+new String(name.getBytes("iso-8859-1"),"utf-8")+",code="+code);
System.out.println("name="+new String(name.getBytes("iso-8859-1"),"utf-8"));
System.out.println("code="+code);
}
}
客户端代码:
布局regist.xml(随便添加了点多余的。。为了好看点0.0)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="name"
android:id="@+id/ip_name"
android:layout_centerInParent="true"
android:paddingLeft="40dp"
android:paddingRight="40dp"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/ip_name"
android:hint="code"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:id="@+id/ip_code"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Regist"
android:id="@+id/regist"
android:layout_below="@+id/ip_code"
android:background="#00000000"
android:textColor="#ff6c54"
android:onClick="Click"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="250dp"
android:src="@drawable/smaritan"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/regist"
android:text="Welcome To New World"
android:layout_centerHorizontal="true"
android:textSize="25sp"
android:id="@+id/text1"
android:textColor="#ff526c" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text1"
android:text="Try To Find A Way Out?"
android:textSize="20sp"
android:layout_centerHorizontal="true"
android:textColor="#ff558d" />
</RelativeLayout>
HttpThread.java
public class HttpThread extends Thread {
String url;
String ip_name;
String ip_code;
public HttpThread(String url, String ip_name, String ip_code) {
this.url = url;
this.ip_name = ip_name;
this.ip_code = ip_code;
}
private void doGet(){
//Get()只能通过url传递参数,所以如下处理
//同时像服务器发送中文需要进行转码即:ip_name--->URLEncoder.encode(ip_name,"utf-8")
try {
url = url + "?name=" + URLEncoder.encode(ip_name,"utf-8")+ "&code=" //<*>
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
//设置请求方式
conn.setRequestMethod("GET");
//设置请求超时时间
conn.setReadTimeout(5000);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String str;
StringBuffer sb = new StringBuffer();
while ((str=bufferedReader.readLine())!=null){
sb.append(str);
System.out.println("result:"+sb.toString());
}
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
doGet();
}
}
RegistActivity.java
public class RegistActivity extends Activity {
private EditText ip_name;
private EditText ip_code;
private Button regist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.regist);
ip_name = (EditText) findViewById(R.id.ip_name);
ip_code = (EditText) findViewById(R.id.ip_code);
}
public void Click(View v){
//手机无法识别localhost(http://localhost:8080/web/MyServlet),所以要改为主机ip地址
String url = "http://192.168.1.100:8080/web/MyServlet";
new HttpThread(url,ip_name.getText().toString(),ip_code.getText().toString()).start();
}
}
POST方法传递数据:(发送的数据量较大使用)
HttpThreadPost.java
public class HttpThreadPost extends Thread {
String url;
String ip_name;
String ip_code;
public HttpThreadPost(String url, String ip_name, String ip_code) {
this.url = url;
this.ip_name = ip_name;
this.ip_code = ip_code;
}
@Override
public void run() {
doPost();
}
public void doPost(){
//创建URL对象
try {
URL httpurl = new URL(url);
//创建HttpUrlConnection对象
HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();
conn.setRequestMethod("POST");
//指定超时时间
conn.setReadTimeout(5000);
//获取输出流对象
OutputStream out = conn.getOutputStream();//<*>
//向服务器提交数据(字节)
String content = "name="+ip_name+"&code="+ip_code;//<*>
out.write(content.getBytes());//<*>
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String str;
while ((str=bufferedReader.readLine())!=null){
sb.append(str);
}
System.out.println(sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
RegistActivity.java
public class RegistActivity extends Activity {
private EditText ip_name;
private EditText ip_code;
private Button regist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.regist);
ip_name = (EditText) findViewById(R.id.ip_name);
ip_code = (EditText) findViewById(R.id.ip_code);
}
public void Click(View v){
//手机无法识别localhost(http://localhost:8080/web/MyServlet),所以要改为主机ip地址
String url = "http://192.168.1.100:8080/web/MyServlet";
new HttpThreadPost(url,ip_name.getText().toString(),ip_code.getText().toString()).start();
}
}
从服务器解析Json在客户端显示:
Json:
{
"result": 1,
"personData": [
{
"name": "Shaw",
"age": 28,
"url": "http://www.3dmgame.com/uploads/allimg/150815/300_150815210817_1.png",
"schoolInfo": [
{
"school_name": "POI"
},
{
"school_name": "THE MACHINE"
}
]
},
{
"name": "Root",
"age": 25,
"url": "http://img.rrmj.tv/article/20150504/b_1430724346531.jpg",
"schoolInfo": [
{
"school_name": "POIi"
},
{
"school_name": "Smaritan"
}
]
}
]
}
图片url:
1.http://www.3dmgame.com/uploads/allimg/150815/300_150815210817_1.png
2.http://img.rrmj.tv/article/20150504/b_1430724346531.jpg
网页url:
http://192.168.1.100:8080/web/JsonServlet
客户端:
jsonlayout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"
android:layout_weight="1"
/>
</LinearLayout>
jasonitem.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/photo"
android:layout_alignParentLeft="true"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/name"
android:textSize="20sp"
android:text="name"
android:layout_toRightOf="@+id/photo"
android:paddingLeft="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/age"
android:textSize="20sp"
android:text="age"
android:layout_toRightOf="@+id/photo"
android:layout_below="@+id/name"
android:paddingLeft="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/school1"
android:textSize="20sp"
android:text="school1"
android:layout_toRightOf="@+id/photo"
android:layout_below="@+id/age"
android:paddingLeft="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/school2"
android:textSize="20sp"
android:text="school2"
android:layout_toRightOf="@+id/photo"
android:layout_below="@+id/school1"
android:paddingLeft="10dp"/>
</RelativeLayout>
PersonJson.java:
public class PersonJson {
private String name;
private int age;
private String url;
private List<SchoolInfoJson>schoolInfo;
//set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public List<SchoolInfoJson> getSchoolInfo() {
return schoolInfo;
}
public void setSchoolInfo(List<SchoolInfoJson> schoolInfo) {
this.schoolInfo = schoolInfo;
}
}
SchoolJson.java:
public class SchoolInfoJson {
private String school_name;
public String getSchool_name() {
return school_name;
}
public void setSchool_name(String school_name) {
this.school_name = school_name;
}
}
此处PersonJson和SchoolJson可以直接用Android Studio的GsonFormat解析生成。
HttpJson.java:
//此类用作网络请求解析Json
public class HttpJson extends Thread {
private String url;
private Context context;
private ListView listView;
private JsonAdapter jsonAdapter;
private Handler handler;
public HttpJson(String url, ListView listView, JsonAdapter jsonAdapter,Handler handler) {
this.url = url;
this.listView = listView;
this.jsonAdapter = jsonAdapter;
this.handler = handler;
}
@Override
public void run() {
try {
URL httpurl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String str;
while ((str=bufferedReader.readLine())!=null){
sb.append(str);
}
final List<PersonJson>data = parseJson(sb.toString());
handler.post(new Runnable(){
@Override
public void run() {
jsonAdapter.setData(data);
listView.setAdapter(jsonAdapter);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private List<PersonJson> parseJson(String json){//<1.12>返回List<PersonJson>数据
try {
JSONObject object = new JSONObject(json);
//将解析内容转换为实体数据<1>
List<PersonJson> persons = new ArrayList<PersonJson>();//<1.1>
//解析Json
int reslut = object.getInt("result");
if (reslut==1){
//创建数组
JSONArray personData = object.getJSONArray("personData");
//遍历
for(int i = 0 ; i < personData.length(); i++){
PersonJson personObject = new PersonJson();//<1.2>
//取出数组对应的每一个Json object对象
JSONObject person = personData.getJSONObject(i);
String name = person.getString("name");
int age = person.getInt("age");
String url = person.getString("url");
personObject.setName(name);//<1.3>
personObject.setAge(age);//<1.4>
personObject.setUrl(url);//<1.5>
persons.add(personObject);//<1.6>
JSONArray schoolInfo = person.getJSONArray("schoolInfo");
List<SchoolInfoJson> schInfos = new ArrayList<SchoolInfoJson>(); //创建一个schoolInfoList的集合<1.7>
personObject.setSchoolInfo(schInfos);//<1.10>
for (int j = 0; j < schoolInfo.length(); j ++){
JSONObject school = schoolInfo.getJSONObject(j);
String schoolName = school.getString("school_name");
SchoolInfoJson info = new SchoolInfoJson();//<1.8>
info.setSchool_name(schoolName);//<1.9>
schInfos.add(info);//<1.10>
}
}return persons;//<1.13>返回数据表
}
else {
Toast.makeText(context,"error",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
HttpImage.java:
//此类用于显示图片
public class HttpImage extends Thread {
private String url;
private Handler handler;
private ImageView photo;
public HttpImage(String url, Handler handler, ImageView photo) {
this.url = url;
this.handler = handler;
this.photo = photo;
}
@Override
public void run() {
try {
URL httpurl = new URL(url);
//得到HttpUrlConnection对象
HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();
//设置超时时间
conn.setReadTimeout(5000);
//设置请求方式
conn.setRequestMethod("GET");
InputStream in = conn.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(in);
handler.post(new Runnable() {
@Override
public void run() {
photo.setImageBitmap(bitmap);
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
JsonAdapter.java:
public class JsonAdapter extends BaseAdapter {
private List<PersonJson> list;
private Context context;
//用于初始化布局
private LayoutInflater inflater;
private Handler handler = new Handler();
public JsonAdapter(List<PersonJson> list, Context context) {
this.list = list;
this.context = context;
inflater = LayoutInflater.from(context);
}
public JsonAdapter(Context context){
this.context = context;
inflater = LayoutInflater.from(context);
}
public void setData(List<PersonJson>data){
this.list =data;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder = null;
if(convertView==null){
//初始化布局
convertView = inflater.inflate(R.layout.jsonitem,null);
holder = new Holder(convertView);
convertView.setTag(holder);
}
else {
holder = (Holder) convertView.getTag();
}
//若得到实体数据就设置界面信息
PersonJson person = list.get(position);
holder.name.setText(person.getName());
holder.age.setText(""+person.getAge());
List<SchoolInfoJson>school = person.getSchoolInfo();
SchoolInfoJson schoolInfo1 = school.get(0);
SchoolInfoJson schoolInfo2 = school.get(1);
holder.school1.setText(schoolInfo1.getSchool_name());
holder.school2.setText(schoolInfo2.getSchool_name());
new HttpImage(person.getUrl(),handler,holder.photo).start();
return convertView;
}
class Holder{
private TextView name;
private TextView age;
private TextView school1;
private TextView school2;
private ImageView photo;
//创造其构造方法
public Holder(View view){
//初始化
name = (TextView) view.findViewById(R.id.name);
age = (TextView) view.findViewById(R.id.age);
school1 = (TextView) view.findViewById(R.id.school1);
school2 = (TextView) view.findViewById(R.id.school2);
photo = (ImageView) view.findViewById(R.id.photo);
}
}
}
JsonActivity.java:
public class JsonActivity extends Activity {
private ListView listView;
private JsonAdapter jsonAdapter;
private Handler handler =new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jasonlayout);
listView = (ListView) findViewById(R.id.listView);
jsonAdapter = new JsonAdapter(this);
String url ="http://192.168.1.100:8080/web/JsonServlet";
new HttpJson(url, listView, jsonAdapter,handler).start();
}
}
多线程下载:
TIPS>>>
<1.Http协议字段 Range "bytes="+start+"-"+end
<2.RandomAccessFile设置吸入的位置
<3.开启线程发送网络请求
DownLoad.java
public
class DownLoad {
private Handler handler;
public DownLoad(Handler handler){
this.handler = handler;
}
//在本地通过线程池下载对象
private Executor threadPool = Executors.newFixedThreadPool(3);
static class DownLoadRunnable implements Runnable{
private String url;
private String fileName;
private long start;
private long end;
private Handler handler;
//指定构造方法传进数据
public DownLoadRunnable(String url, String fileName, long start, long end, Handler handler) {
this.url = url;
this.fileName = fileName;
this.start = start;
this.end = end;
this.handler = handler;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setReadTimeout(5000);
//指定数据的长度
conn.setRequestProperty("Range","bytes="+start+"-"+end);
//设置请求方式
conn.setRequestMethod("GET");
//向本地文件写入
RandomAccessFile access = new RandomAccessFile(new File(fileName),"rwd");
//指定位置进行读写
access.seek(start);
//读取数据
InputStream is =conn.getInputStream();
//创建传送区域
byte[] b = new byte[1024*4];
int len = 0;
while ((len = is.read(b))!=-1){
access.write(b,0,len);
}
if (access!=null){
access.close();
}
if (is!=null){
is.close();
}
//更新UI(文件下载完成后向主线程发送一个消息)
Message msg = new Message();
msg.what=1;
handler.sendMessage(msg);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void downLoadFile(String url){
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
//获取下载对象总体的长度
int count = conn.getContentLength();
//通过3个线程下载,每个线程下载的长度:
int block = count/3;
String fileName = getFileName(url);
//得到文件名后指定文件下载地址(下载到SD卡)
File parent = Environment.getExternalStorageDirectory();
File fileDownload = new File(parent,fileName);
//向线程池提交任务
for(int i = 0; i < 3; i++){
long start = i*block;
long end =(i+1)*block-1;
if (i==2){
end =count;
}
//创建Runnable对象
DownLoadRunnable runnable =new DownLoadRunnable(url,fileDownload.getAbsolutePath(),start,end,handler);
//通过线程池提交任务
threadPool.execute(runnable);
}
}
catch (IOException e) {
}
}
//定义方法取出url后缀名(得到文件名字)
public String getFileName(String url){
return url.substring(url.lastIndexOf("/"+1));
}
DownLoadActivity.java:
public class DownloadActivity extends Activity {
private Button button;
private TextView textView;
private int count = 0;
private Handler handler = new Handler(){
public void handleMessage(Message msg){
int result = msg.what;
count+=result;
if(count==3){
textView.setText("download completed");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
button = (Button) findViewById(R.id.download);
textView = (TextView) findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread() {
@Override
public void run() {
//添加DownLoad对象
DownLoad load = new DownLoad(handler);
String url = "http://192.168.1.100:8080/web/hoby.png";
load.downLoadFile(url);
}
}.start();
Toast.makeText(DownloadActivity.this, Environment.getExternalStorageDirectory().toString(), Toast.LENGTH_LONG).show();
}
});
}
}