zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ES7/ES8 语法学习
    JavaScript中this对象原理简洁说明
    浅谈http协议
    各个浏览器之间常见的兼容性问题
    npm -v 报错:cannot find module 'core-util-is'
    对象遍历的几种方法
    Vue项目如何关闭Eslint检测
    axios 基本运用
    如何去掉vue路由中的#
    vue 父子组件、兄弟组件传值
  • 原文地址:https://www.cnblogs.com/begin1949/p/5060802.html
Copyright © 2011-2022 走看看