HTTP通信
来源:互联网 发布:ubuntu安装1080驱动 编辑:程序博客网 时间:2024/06/05 06:48
什么是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:
//此类用作网络请求解析Jsonpublic 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(); } }); }}
- Http 通信
- http通信
- HTTP 通信
- Http通信
- Http通信
- Http通信
- HTTP 通信
- Http通信
- http通信
- HTTP通信
- HTTP通信
- Http通信
- 【HTTP】HTTP通信步骤
- http通信和tcp通信
- HTTP 通信http通信过程简介
- HTTP 通信http通信过程简介
- android-async-http(http通信)
- http通信过程简介
- c/c++插入排序
- 《JQuery基础教程》第四版课后练习代码--第四章
- 顺时针旋转矩阵
- HNOI 2002 (Splay入门题,无更新操作)
- Android屏幕适配全攻略(最权威的官方适配指导)
- HTTP通信
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- sublime Text 3实用功能和常用快捷键
- 第五章、epub文件处理 -- 解压epub文件
- 909422229__8、基数排序__程序员必须知道的8大排序和3大查找
- HIVE无法正常启动,报找不到jdbc的驱动类
- Xcode_7 iOS_9 索引栏 Objective-C (11)
- PullToRefresh的上拉加载下拉刷新
- ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示