android网络编程之HttpUrlConnection的讲解--上传大文件
1、服务器后台使用Servlet开发,这里不再介绍。
2、网络开发不要忘记在配置文件中添加访问网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
3、网络请求、处理不能在主线程中进行,一定要在子线程中进行。因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的。(主线程应该只进行UI绘制,像网络请求、资源下载、各种耗时操作都应该放到子线程中)。
4、传输大文件的时候会出现OOM出错,所以我们可以设置每次传输流的大小。
5、
public class FileActivity extends Activity {
private TextView mTvMsg;
private String result = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_file);
initView();
}
private void initView(){
mTvMsg = (TextView) findViewById(R.id.tv_msg);
new Thread(fileThread).start();
}
private Thread fileThread = new Thread(){
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL("http://192.168.23.1:8080/TestProject/FileTest");
connection = (HttpURLConnection) url.openConnection();
// 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃
// 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP请求正文的流。
connection.setChunkedStreamingMode(51200); // 128K
// 不使用缓存
connection.setUseCaches(false);
// 设置请求方式
connection.setRequestMethod("POST");
// 设置编码格式
connection.setRequestProperty("Charset", "UTF-8");
// 设置容许输出
connection.setDoOutput(true);
// 上传文件
FileInputStream file = new FileInputStream(Environment.getExternalStorageDirectory().getPath()
+ "/aaaaa/baidu_map.apk");
OutputStream os = connection.getOutputStream();
byte[] b = new byte[1024];
int count = 0;
while((count = file.read(b)) != -1){
os.write(b, 0, count);
}
os.flush();
os.close();
// 获取返回数据
if(connection.getResponseCode() == 200){
InputStream is = connection.getInputStream();
result = StringStreamUtil.inputStreamToString(is);
Message msg = Message.obtain();
msg.what = 0;
fileHandler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(connection != null){
connection.disconnect();
}
}
};
};
private Handler fileHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0 && result!=null){
mTvMsg.setText(result);
}
};
};
}
6、输出流OutputStream的三个方法,第二和第三个方法应该是安全的,但第一个方法可能出现错误。因为你没读1024字节,却写了1024字节,所以可能出错。(我试了几次是出错的,也可能是我代码写错了,但我建议大家还是不要使用第一个方法)。
os.write(byte[] buffer);
os.write(int arg0);
os.write(byte[] buffer, int offset, int count);
7、android HttpURLConnection上传文件出现Content-Length的长度限制参考博文:
http://www.oschina.net/question/223455_44878
8、android 上传大文件中断参考博文:
http://www.oschina.net/question/94349_58751
android网络编程之HttpUrlConnection的讲解--上传大文件的更多相关文章
- android网络编程之HttpUrlConnection的讲解--POST请求
1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...
- android网络编程之HttpUrlConnection的讲解--实现文件的断点上传
1.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/& ...
- android网络编程之HttpUrlConnection的讲解--DownLoadManager基本用法
1.DownLoadManager是Android用系统服务(Service)的方式来优化处理长时间的下载操作的一个工具类.避免了我们去处理多线程,通知栏等等. 2.不要忘记添加权限 <uses ...
- android网络编程之HttpUrlConnection的讲解--实现文件断点下载
1.没有实现服务器端,下载地址为网上的一个下载链接. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...
- android网络编程之HttpUrlConnection的讲解--GET请求
1.服务器后台使用Servlet开发,这里不再介绍. 2.测试机通过局域网链接到服务器上,可以参考我的博客:http://www.cnblogs.com/begin1949/p/4905192.htm ...
- Android 网络编程之HttpURLConnection运用
Android 网络编程之HttpURLConnection 利用HttpURLConnection对象,我们可以从网络中获取网页数据. 01 URL url = new URL("http ...
- android 网络编程之HttpURLConnection与HttpClient使用与封装
1.写在前面 大部分andriod应用需要与服务器进行数据交互,HTTP.FTP.SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议. 本文并 ...
- java 26 - 9 网络编程之 TCP协议多用户上传文件
TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...
- Android网络编程之HttpClient运用
Android网络编程之HttpClient运用 在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们 ...
随机推荐
- IIS的php环境配置
session保存 再找到 session.save_path = /tmp ,将其改为 session.save_path = C:\php-4.3.2-Win32\sessions .(注:此时你 ...
- HDU - 3068 最长回文(manacher)
HDU - 3068 最长回文 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Subm ...
- IOC(控制反转)
一.容器与Bean 在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由Spring容器初始化.装配及管 ...
- [PCB设计] 3、用CAM350修改GERBER文件(删除某些部分)
1.问题产生 由于在电子元件封装时阻焊开窗未处理好,生成的GERBER文件在生产钢网时容易出现错误.比如:测试点上不需要上锡,如果封装元件时采用焊盘修改而来,结果往往使paste层在该测试点上有覆盖, ...
- Java缓存框架
JBossCache/TreeCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你轻松进行Jboss服务器之间的集群工作 ...
- HTML5根据浏览器获取经度和纬度(百度API)
网页获取用户位置信息的办法1 调用百度地图的地图标注功能,通过百度地图API获取对应的经度和纬度进而获取地区信息 优点是比较准确,缺点是需要用户自己选择位置2 通过H5 geolocation属性获取 ...
- BZOJ3963: [WF2011]MachineWorks
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3963 CDQ分治加凸包.具体看这篇题解:http://www.acmerblog.com/ ...
- csu oj Infected Computer 1427
#include <iostream> #include <algorithm> #include <stdio.h> #define max 20005 #def ...
- 朱丽叶—Cuda+OSG
#include <cuda_runtime.h> #include <osg/Image> ; typedef struct cuComplex { float r; flo ...
- ActiveMQ in Action(2) - Transport
关键字: activemq 2.2 Transport ActiveMQ目前支持的transport有:VM Transport.TCP Transport.SSL Transport.Peer ...