Android Http 下载
在安卓中,可以直接用java的java.net.URL包访问网络下载数据。不同的是,安卓程序需要权限,需要在AndroidManifest.xml文件中声明权限
- <!-- 网络权限 -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- 操作sd卡权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 网络权限 --><uses-permission android:name="android.permission.INTERNET"/><!-- 操作sd卡权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
不过有个需要注意的是,我使用的是最新的adt安卓开发集成eclipse的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。
但是,有些组件设置值,他必须是在主线程的循环中,才可以。
- Looper loop = Looper.getMainLooper();
- handler = new Handler(loop){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- switch (msg.what) {
- case SETTEXT:
- //主线程ui更新text值
- text.setText(msg.obj.toString());
- break;
- }
- }
- };
- download.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- //新线程下载
- new Thread(new Runnable() {
- @Override
- public void run() {
- //新建一个下载
- Download load = new Download(url);
- String value = load.downloadAsString();
- Message msg = handler.obtainMessage();
- msg.obj = value;
- msg.what = SETTEXT;
- msg.sendToTarget();
- }
- }).start();
- }
- });
Looper loop = Looper.getMainLooper();
handler = new Handler(loop){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);switch (msg.what) {case SETTEXT://主线程ui更新text值text.setText(msg.obj.toString());break;}}
};download.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {//新线程下载new Thread(new Runnable() {@Overridepublic void run() {//新建一个下载Download load = new Download(url);String value = load.downloadAsString();Message msg = handler.obtainMessage();msg.obj = value;msg.what = SETTEXT;msg.sendToTarget();}}).start();}
});
Download类:
- package com.example.org.suju.download;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.os.Environment;
- import android.util.Log;
- public class Download {
- /** 连接url */
- private String urlstr;
- /** sd卡目录路径 */
- private String sdcard;
- /** http连接管理类 */
- private HttpURLConnection urlcon;
- public Download(String url)
- {
- this.urlstr = url;
- //获取设备sd卡目录
- this.sdcard = Environment.getExternalStorageDirectory() + "/";
- urlcon = getConnection();
- }
- /*
- * 读取网络文本
- */
- public String downloadAsString()
- {
- StringBuilder sb = new StringBuilder();
- String temp = null;
- try {
- InputStream is = urlcon.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- while ((temp = br.readLine()) != null) {
- sb.append(temp);
- }
- br.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return sb.toString();
- }
- /*
- * 获取http连接处理类HttpURLConnection
- */
- private HttpURLConnection getConnection()
- {
- URL url;
- HttpURLConnection urlcon = null;
- try {
- url = new URL(urlstr);
- urlcon = (HttpURLConnection) url.openConnection();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return urlcon;
- }
- /*
- * 获取连接文件长度。
- */
- public int getLength()
- {
- return urlcon.getContentLength();
- }
- /*
- * 写文件到sd卡 demo
- * 前提需要设置模拟器sd卡容量,否则会引发EACCES异常
- * 先创建文件夹,在创建文件
- */
- public int down2sd(String dir, String filename, downhandler handler)
- {
- StringBuilder sb = new StringBuilder(sdcard)
- .append(dir);
- File file = new File(sb.toString());
- if (!file.exists()) {
- file.mkdirs();
- //创建文件夹
- Log.d("log", sb.toString());
- }
- //获取文件全名
- sb.append(filename);
- file = new File(sb.toString());
- FileOutputStream fos = null;
- try {
- InputStream is = urlcon.getInputStream();
- //创建文件
- file.createNewFile();
- fos = new FileOutputStream(file);
- byte[] buf = new byte[1024];
- while ((is.read(buf)) != -1) {
- fos.write(buf);
- //同步更新数据
- handler.setSize(buf.length);
- }
- is.close();
- } catch (Exception e) {
- return 0;
- } finally {
- try {
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return 1;
- }
- /*
- * 内部回调接口类
- */
- public abstract class downhandler
- {
- public abstract void setSize(int size);
- }
- }
package com.example.org.suju.download;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;import android.os.Environment;
import android.util.Log;public class Download {/** 连接url */private String urlstr;/** sd卡目录路径 */private String sdcard;/** http连接管理类 */private HttpURLConnection urlcon;public Download(String url){this.urlstr = url;//获取设备sd卡目录this.sdcard = Environment.getExternalStorageDirectory() + "/";urlcon = getConnection();}/** 读取网络文本*/public String downloadAsString(){StringBuilder sb = new StringBuilder();String temp = null;try {InputStream is = urlcon.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));while ((temp = br.readLine()) != null) {sb.append(temp);}br.close();} catch (Exception e) {e.printStackTrace();}return sb.toString();}/** 获取http连接处理类HttpURLConnection*/private HttpURLConnection getConnection(){URL url;HttpURLConnection urlcon = null;try {url = new URL(urlstr);urlcon = (HttpURLConnection) url.openConnection();} catch (Exception e) {e.printStackTrace();}return urlcon;}/** 获取连接文件长度。*/public int getLength(){return urlcon.getContentLength();}/** 写文件到sd卡 demo* 前提需要设置模拟器sd卡容量,否则会引发EACCES异常* 先创建文件夹,在创建文件*/public int down2sd(String dir, String filename, downhandler handler){StringBuilder sb = new StringBuilder(sdcard).append(dir);File file = new File(sb.toString());if (!file.exists()) {file.mkdirs();//创建文件夹Log.d("log", sb.toString());}//获取文件全名sb.append(filename);file = new File(sb.toString());FileOutputStream fos = null;try {InputStream is = urlcon.getInputStream();//创建文件file.createNewFile();fos = new FileOutputStream(file);byte[] buf = new byte[1024];while ((is.read(buf)) != -1) {fos.write(buf);//同步更新数据handler.setSize(buf.length);}is.close();} catch (Exception e) {return 0;} finally {try {fos.close();} catch (IOException e) {e.printStackTrace();}}return 1;}/** 内部回调接口类*/public abstract class downhandler{public abstract void setSize(int size);}
}
线程下载提示Activity:
用一个线程循环处理网络下载,并使用下载类回调函数,发送处理消息给主线程消息处理方法,同步更新滚动条值。
- @Override
- rotected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.download);
- text = (TextView) findViewById(R.id.label);
- load = (ProgressBar) findViewById(R.id.load);
- //获取传递的Intent的Bundle的url键值
- final String url = getIntent().getExtras().getString("url");
- final Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- //这里就一条消息
- int pro = load.getProgress() + msg.arg1;
- load.setProgress(pro);
- text.setText(Integer.toString(pro));
- if (pro >= load.getMax()) {
- finish(); //结束下载进度框
- }
- }
- };
@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.download);text = (TextView) findViewById(R.id.label);load = (ProgressBar) findViewById(R.id.load);//获取传递的Intent的Bundle的url键值final String url = getIntent().getExtras().getString("url");final Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//这里就一条消息int pro = load.getProgress() + msg.arg1;load.setProgress(pro);text.setText(Integer.toString(pro));if (pro >= load.getMax()) {finish(); //结束下载进度框}}};
- new Thread(new Runnable() {
- @Override
- public void run() {
- //另起线程执行下载,安卓最新sdk规范,网络操作不能再主线程。
- Download l = new Download(url);
- load.setMax(l.getLength());
- /**
- * 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量
- * downhandler是Download的内部类,作为回调接口实时显示下载数据
- */
- int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {
- @Override
- public void setSize(int size) {
- Message msg = handler.obtainMessage();
- msg.arg1 = size;
- msg.sendToTarget();
- Log.d("log", Integer.toString(size));
- }
- });
- //log输出
- Log.d("log", Integer.toString(status));
- }
- }).start();
new Thread(new Runnable() {@Overridepublic void run() {//另起线程执行下载,安卓最新sdk规范,网络操作不能再主线程。Download l = new Download(url);load.setMax(l.getLength());/*** 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量* downhandler是Download的内部类,作为回调接口实时显示下载数据*/int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {@Overridepublic void setSize(int size) {Message msg = handler.obtainMessage();msg.arg1 = size;msg.sendToTarget();Log.d("log", Integer.toString(size));}});//log输出Log.d("log", Integer.toString(status));}}).start();}
对话框模式的Activity需要设置一个属性android:theme。
- <activity
- android:name="com.example.org.suju.download.DownloadActivity"
- android:theme="@android:style/Theme.Dialog"
- ></activity>
<activity
android:name="com.example.org.suju.download.DownloadActivity"
android:theme="@android:style/Theme.Dialog"></activity>
使用一个按钮启动下载对话框Activity,并传递数据
- down2sd.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, DownloadActivity.class);
- Bundle bundle = new Bundle();
- bundle.putString("url", urlstr.getText().toString());
- intent.putExtras(bundle);
- startActivity(intent);
- }
- });
down2sd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent();intent.setClass(MainActivity.this, DownloadActivity.class);Bundle bundle = new Bundle();bundle.putString("url", urlstr.getText().toString());intent.putExtras(bundle);startActivity(intent);}
});
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android Http 下载相关推荐
- Android源代码下载与编译 - 2019
Android源代码下载与编译 - 2019 (基于Ubuntu 18.10,适用于国内环境) 下载repo工具 如果没有下载repo脚本工具,请到清华mirror下载 curl https://mi ...
- android 多线程下载,断点续传,线程池
android 多线程下载,断点续传,线程池 你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效 ...
- Windows Android SDK下载安装,配置,异常问题解决教程
Windows Android SDK下载安装,配置,异常问题解决教程 参考文章: (1)Windows Android SDK下载安装,配置,异常问题解决教程 (2)https://www.cnbl ...
- Android SDK下载失败的解决方法
Android SDK下载失败的解决方法 图1 在下载过程中,Android SDK Manager Log中出现下面出错信息: Preparing toinstall archives Downlo ...
- Android Studio下载及安装3.0版本
今天,继续简单讲讲Android studio3.0如何安装. 之前写过Android studio的安装,那个是Android 2.2.3版本,这次由于导入3.0项目,所以重新安装了Android ...
- Android源代码下载方法具体解释
作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如 ...
- Android Studio下载安装教程及开发环境搭建
Android Stuio是本次Google io的一大亮点啊,一大早起来就赶紧下载来玩玩了... 如果你不幸被墙了,可以去这个帖子下载,我已经上传到百度盘里面了. [Android利器]Androi ...
- Android Studio下载、安装、配置及连接真机开发第一个App ——入门选手快进
最近的安卓测试给我心态搞蹦了,问也没人问,难受简直了!又是一轮自学之路(说实话这一路上教会我一个很大的道理就是一定要有愿意帮助你的老师,还有自己的自觉,一样也不能少.前者没有的话只能后者补了呜呜呜 ...
- Android Studio下载
最新版本的Android Studio 2.1 RC下载地址: Windows: https://dl.google.com/dl/android/studio/ide-zips/2.1.0.8/an ...
- Android 4.4环境搭建——Android SDK下载与安装
学习开发Android应用程序,须要下载安装Android SDK.在Android的官方站点的二级域名http://developer.android.com/index.html中.能够下载到完整 ...
最新文章
- TVM cmake示例展示
- Redis key 相关命令
- [工具]OFFICE插件管理工具-帮助更好地管理及使用电脑安装过的OFFICE插件
- echarts label加边框_echarts 添加自定义label标签
- linux查看tomcat启动内存溢出,关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论-Fun言...
- CacheManager操作缓存
- TCxGrid 把列移上移下。
- 5.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务安全
- ssm提交post_SSM中get和post乱码笔记
- 资产管理软件 GLPI的安装(转)
- 传动系统结构简图_液压传动系统结构示意图画图技巧(攻略)
- MFC 通用对话框之“查找/替换“对话框
- 天正的计算机快捷命令大全,天正建筑快捷键大全:天正建筑cad快捷键命令大全...
- java冻结jsp首行_收藏的 处理jsp首行 报错问题
- 从事java开发工作三年的感想
- html网页如何限制ip访问量,Nginx 限制IP访问频率
- 官宣 | 首届云原生编程挑战赛报名通道正式开启
- AMiner 会议论文推荐第十四期
- SysML-Sec: A Model-Driven Environment for Developing Secure Embedded Systems
- Xshell光标消失
热门文章
- ajax异步刷新gridview,如何刷新Gridview的内容(ajax)
- 关于JVM参数-XX:SurvivorRatio的理解
- Opengl绘制地图
- Linux FFmpeg依赖库编译
- ff14注册完服务器可以转,FF14跨区角色转移试行规则公告 详细跨区转服问题答疑...
- locust之安装(3)
- 多目标优化算法:MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比(提供MATLAB源码)
- 将本地端口映射子域名
- windows下python subprocess.call使用ffmpeg的问题记录
- 租用香港服务器机房机柜,费用由哪些部分组成