Android学习笔记--使用Apache HttpClient实现网络下载效果,附带进度条显示

今天学习 了Apache 写了一个网络下载的效果,代码如下,代码中我已经写了很详细的注释了,相信大家都能看懂

  1 http://m.blog.csdn.net/article/details?id=52927536
  2
  3
  4 package com.wuxianedu.httpdemo;
  5
  6 import android.app.ProgressDialog;
  7 import android.content.Intent;
  8 import android.net.Uri;
  9 import android.os.AsyncTask;
 10 import android.support.v7.app.AppCompatActivity;
 11 import android.os.Bundle;
 12 import android.view.View;
 13 import android.widget.Button;
 14 import android.widget.Toast;
 15
 16 import org.apache.http.HttpResponse;
 17 import org.apache.http.client.HttpClient;
 18 import org.apache.http.client.methods.HttpGet;
 19 import org.apache.http.impl.client.DefaultHttpClient;
 20
 21 import java.io.FileOutputStream;
 22 import java.io.IOException;
 23 import java.io.InputStream;
 24 import java.io.OutputStream;
 25
 26 public class Main2Activity extends AppCompatActivity implements View.OnClickListener{
 27
 28     private Button button;
 29     private ProgressDialog dialog;
 30     private String path;
 31     private final int TA_C = 0;//成功
 32     private final int TA_S = -1;//失败
 33
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.activity_main2);
 38         button = (Button) findViewById(R.id.but_id);
 39         button.setOnClickListener(this);
 40     }
 41
 42     @Override
 43     public void onClick(View view) {
 44         switch (view.getId()){
 45             case R.id.but_id:
 46                 new Myhui().execute("http://g.pc6.com/0942666043/apk/4001_ZMJ2016_04_20161028_rnikgd.apk");
 47                 break;
 48         }
 49     }
 50
 51     class Myhui extends AsyncTask<String,Integer,Integer>{
 52         //异步任务执行前的操作
 53         @Override
 54         protected void onPreExecute() {
 55             dialog = new ProgressDialog(Main2Activity.this);
 56             dialog.setTitle("正在下载");
 57             dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 58             dialog.show();
 59             super.onPreExecute();
 60         }
 61         //更新进度的方法 调用使用publishProgress
 62         @Override
 63         protected void onProgressUpdate(Integer... values) {
 64             dialog.setProgress(values[0]);
 65             super.onProgressUpdate(values);
 66         }
 67         //任务执行中方法
 68         @Override
 69         protected Integer doInBackground(String... strings) {
 70             //构建URL地址链接
 71             HttpGet httpGet = new HttpGet(strings[0]);
 72             //建立客户端链接
 73             HttpClient httpClient = new DefaultHttpClient();
 74             try {
 75                 //获取服务器响应的数据
 76                 HttpResponse response = httpClient.execute(httpGet);
 77                 //获取状态码
 78                 int code = response.getStatusLine().getStatusCode();
 79                 switch (code){
 80                     case 201:
 81                     case 200:
 82                         //获取文件最大值
 83                         int zuimax = (int) response.getEntity().getContentLength();
 84                         //给进度条赋最大值
 85                         dialog.setMax(zuimax);
 86                         //获取文件的输入流
 87                         InputStream is = response.getEntity().getContent();
 88                         //获取储存地址
 89                         path = getExternalCacheDir().getParent()+"/tanchishe.apk";
 90                         //获取文件的输出流,传入写入文件的地址
 91                         OutputStream os = new FileOutputStream(path);
 92                         int length;
 93                         //进度条进度
 94                         int jindu = 0;
 95                         byte[] bytes = new byte[1024];
 96                         while ((length = is.read(bytes))!= -1){
 97                             os.write(bytes,0,length);
 98                             jindu+=length;
 99                             //启动赋值方法
100                             publishProgress(jindu);
101                         }
102                         //关闭流
103                         is.close();
104                         os.flush();
105                         os.close();
106                         return TA_C;
107                     case 401:
108                         break;
109                 }
110             } catch (IOException e) {
111                 e.printStackTrace();
112             }
113             return TA_S;
114         }
115
116         //任务结束方法
117         @Override
118         protected void onPostExecute(Integer integer) {
119             //关闭进度条
120             dialog.dismiss();
121             switch (integer){
122                 case TA_C:
123                     Toast.makeText(Main2Activity.this, "下载成功了", Toast.LENGTH_SHORT).show();
124                     setupApk();
125                     break;
126                 case TA_S:
127                     Toast.makeText(Main2Activity.this, "下载失败了", Toast.LENGTH_SHORT).show();
128                     break;
129             }
130             super.onPostExecute(integer);
131         }
132     }
133
134     /**
135      * 启动应用安装。
136      */
137     private void setupApk() {
138         Intent intent = new Intent(Intent.ACTION_VIEW);
139         //"file://"+文件路径。
140         Uri uri = Uri.parse("file://"+ path);
141         intent.setDataAndType(uri, "application/vnd.android.package-archive");
142         startActivity(intent);
143     }
144 }

下面是布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6
 7     tools:context="com.wuxianedu.httpdemo.Main2Activity">
 8
 9     <Button android:id="@+id/but_id" android:text="下载APP"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content" />
12 </RelativeLayout>
时间: 2024-08-05 06:34:09

Android学习笔记--使用Apache HttpClient实现网络下载效果,附带进度条显示的相关文章

Android学习笔记--使用HttpURLConnection实现网络下载效果,附带进度条显示

下面我就直接上代码了,因为代码中我已经写了非常详细的注释 1 package com.wuxianedu.httpdemo; 2 3 import android.app.ProgressDialog; 4 import android.content.Intent; 5 import android.net.Uri; 6 import android.os.AsyncTask; 7 import android.os.Handler; 8 import android.os.Message;

Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作

1.在android4中,发起网络http操作,不能在Activity的事件(即主线程)中进行,必须在单独的线程中操作. 另外进行网络操作,需要在manifest文件中增加如下的权限: <uses-permission android:name="android.permission.INTERNET" /> 2.下面给出代码事例 public void loadData() { new AsyncTask<String, Void, String>() { @

Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)

前几日Android发布了4.0 Icecream,昨天上网发现Begining Book中有Edition 3的版本,比对一下,还是有相当的改动,不仅仅增加了tablet的部分,对原有的章节有有一些修订,前后的调整等等.先按Edtion 2的顺序看,相同章节的看Edtion 3,然后回头看Edition 3的Chapter 24.25(E2的36).26.27.28.29.44.45.46.47几个新增章节.同时将模拟器改为Android 2.3的版本,已适应可能新增的改动. 访问Intern

【转】 Pro Android学习笔记(七一):HTTP服务(5):多线程调用HttpClient

目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修改HTTP连接的参数 使用共同的Appcliation对象 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 应用共享HttpClient对象的同步问题 在之前的例子中,HttpClient只

Android学习笔记(四六):互联网通信-文件下载

在Android 2.3引入了DownloadManager可以处理复杂的文件下载,包括检查用户是否有数据联系(WIFI或者移动数据),当用户从一个有数据连接的地方移动到无连接的地方(例如离开了wifi或者3G data的access point),确保设备在下载过程中保持awake状态.DownloadManager可以处理HTTP URLs,但是不能处理HTTPS(SSL) URLs. 设置下载文件条件许可 在这个例子,将学习通过DownloadManager从Internet下载文件,并存

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都考虑是否下个Apache,自己弄一个.最后找了个论文查询网站,结果form内容很长,而且很多(少的话就直接用GET).于是下了个WireShare进行抓包,如下,直接从HTTP的请求消息中看要传递哪些参数.(PS:参数有点多,总比弄个web server要强点) HTTP POST小例子 HTTP

【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用service提供很多功能,例如利用Google Maps API,现在我们将聚焦在HTTP serice中. Android SDK提供HttpClient,和J2EE中的接口非常相似.最常用的就是HTTP GET和HTTP POST.相关内容也可以阅读Android学习笔记(四五):互联网通信-Htt

【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Post支持携带body,content-type为multipart.本次我们将尝试通过http post上传一个小文件. 建立测试环境 上传文件的测试环境很难找,下载了Tomcat,想装一个环境,打开后,发现忘得也差不多,要看帮助,比较麻烦,下面是我上传文件到189网盘抓的包,上传一个图片文件,整个