嘟嘟噜嘟嘟 2015-11-26 02:51 采纳率: 0%
浏览 2084
已结题

Android批量上传图片第一次上传会一直在进度条转圈,取消之后再上传之后会一直正常,求大神帮帮忙!

问题描述:写了一个批量上传图片和文字的方法,当第一次点击上传的时候会一直显示进度条,取消进度条之后再次上传会一直正常,经过调试发现第一次点击上传的时候程序运行到LogUtils.logI("响应代码:"+connect.getResponseCode())获取响应代码的时候就不会往下执行了,不报错,就是会一直处于进度条显示状态,第二次及之后都会顺利的获取到响应代码程序执行完成,上传图片成功。后来查了很多资料,还是无法解决。

批量上传图片和文字的实现方法:

@Override
public void upload(String url,Map<String, String> params,
        Map<String, File> files, HttpUploadListener listener) {
            LogUtils.logV("文件上传地址是:" + url);
            String boundary = UUID.randomUUID().toString();
            // 前缀
            String prefix = "--";
            String crlf = "\r\n";

            DataOutputStream dos = null;
            BufferedReader br = null;

            HttpURLConnection connect = null;
            try {
                connect = (HttpURLConnection)new URL(url).openConnection();
                connect.setConnectTimeout(connectTimeout);
                connect.setReadTimeout(readTimeout);
                connect.setDoInput(true);
                connect.setDoOutput(true);
                connect.setUseCaches(false);
                connect.setRequestMethod("POST");
                connect.setRequestProperty("Connection","keep-alive");
                connect.setRequestProperty("Carset","UTF-8");//HttpService.DEFAULT_ENCODING
                connect.setRequestProperty("Content-type","multipart/form-data"+"; boundary="+boundary);

                StringBuffer buffer = new StringBuffer();
                if(params!=null){
                    listener.onStatus("上传基本文字信息。。");
                    for (Map.Entry<String, String> data : params.entrySet()) {
                        buffer.append(prefix).append(boundary).append(crlf);
                        buffer.append("Content-Disposition:form-data; name=\""+data.getKey()+"\"").append(crlf);
                        buffer.append("Content-Type: text/plain; charset=" +"UTF-8").append(crlf);
                        buffer.append("Content-Transfer-Encoding: 8bit").append(crlf);
                        buffer.append(crlf);
                        buffer.append(data.getValue()).append(crlf);
                    }
                }

                dos = new DataOutputStream(connect.getOutputStream());
                dos.write(buffer.toString().getBytes());
                //-----------------------------
                if(!isCancel&&params!=null){
                    Log.i("TAG", "执行文件上传..");
                    for(Map.Entry<String, File> file : files.entrySet()){
                        listener.onStatus("上传文件..."+file.getKey());
                        StringBuffer buffer2 = new StringBuffer();
                        buffer2.append(prefix).append(boundary).append(crlf);
                        buffer2.append("Content-Disposition: form-data; name=\""+file.getKey()+"\"; filename=\""+file.getKey()+"\"").append(crlf);
                        buffer2.append("Content-Type: application/octet-stream; carset=" + "UTF-8").append(crlf);
                        buffer2.append(crlf);
                        dos.write(buffer2.toString().getBytes());

                        InputStream is = new FileInputStream(file.getValue());
                        byte[] temp = new byte[1024];
                        int len = 0;
                        while((len = is.read(temp))!=-1){
                            dos.write(temp,0,len);
                        }
                        is.close();
                        dos.write(crlf.getBytes());
                    }
                }else if(!isCancel&&params==null){
                    Log.i("TAG", "執行。。。。。。。。。。。。。。。");
                    for(Map.Entry<String, File> file : files.entrySet()){
                        listener.onStatus("上传文件..."+file.getKey());
                        StringBuffer buffer2 = new StringBuffer();
                        dos.write(buffer2.toString().getBytes());

                        InputStream is = new FileInputStream(file.getValue());
                        byte[] temp = new byte[1024];
                        int len = 0;
                        while((len = is.read(temp))!=-1){
                            dos.write(temp,0,len);
                        }
                        is.close();
                    }
                }
                byte[] endTag = (prefix+boundary+prefix+crlf).getBytes();

                dos.write(endTag); 
                dos.flush();

                //------------------------
                Log.i("没执行", "执行了让");
                //响应码是否是ok
                LogUtils.logI("响应代码:"+connect.getResponseCode());
                if(!isCancel&&connect.getResponseCode()==HttpURLConnection.HTTP_OK){
                    Log.i("没执行", "呵呵哒");
                    InputStream is = connect.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is, "GBK");
                    br = new BufferedReader(isr);
                    String result = br.readLine();

                    listener.onExecute("加载数据", result);
                    listener.onFinish();

                }else{
                    listener.onError("执行代码:"+connect.getResponseCode());
                }
            } catch (MalformedURLException e) {
                listener.onError("异常:"+e.getMessage());
                LogUtils.logE(CLASS,"异常:"+e.getMessage());
            } catch (IOException e) {
                listener.onError("IO异常:"+e.getMessage());
                LogUtils.logE(CLASS,"IO异常:"+e.getMessage());
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();    
            }finally{
                try{
                    if(dos!=null){
                        dos.close();
                    }
                    if(br!=null){
                        br.close();
                    }
                    if(connect!=null){
                        connect.disconnect();
                    }
                }catch (IOException e) {
                    listener.onError("关闭流异常:"+e.getMessage());
                    LogUtils.logE(CLASS,"关闭流出错!");
                    dos = null;
                    br = null;
                }
            }
}

这个是上传图片的调用:

/**
 * 连接网络      上传身份证件照片
 * @param ATTR_VAL     SIM卡的89编号
 * @param ORDER_NUM    订单编号
 * @param uploadA       身份证正面照文件
 * @param uploadB       身份证反面照文件
 * @param uploadC       自拍照文件
 */
private void httpUpload(final String ATTR_VAL,final String ORDER_NUM,final File uploadA,final File uploadB,final File uploadC){
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            progressDialog = DialogUtils.showProgressDialog(context, "正在处理..");
            progressDialog.setCancelable(true);
        }
    });
    new Thread();
    new Thread(new Runnable() {

        @Override
        public void run() {
            final String Url = Config.getUrl(Config.ZJSCAction);
            logI("上传身份证照片的地址是:"+Url);
            final HashMap<String, String> mapText = new HashMap<String, String>();
            mapText.put("ATTR_VAL",ATTR_VAL);
            mapText.put("ORDER_NUM", ORDER_NUM);

            final HashMap<String, File> mapFiles = new HashMap<String, File>();
            mapFiles.put("uploadA", uploadA);
            mapFiles.put("uploadB", uploadB);
            mapFiles.put("uploadC", uploadC);

            HttpFileUpload httpFileUpload = new HttpFileUploadImpl();
            httpFileUpload.upload(Url, mapText, mapFiles, new HttpUploadListener() {

                @Override
                public void onStatus(String message) {
                    logI("照片上传进度:"+message);
                }

                @Override
                public void onFinish() {
                    showToast("上传操作完成!");
                    DialogUtils.dismissProgressDialog(progressDialog, handler);
                }

                @Override
                public void onExecute(String message, String respons) {
                    logI("上传返回的数据:"+respons);
                }

                @Override
                public void onError(String error) {
                    dismissProgressDialog();
                    logE("照片上传出错:"+error);
                    DialogUtils.dismissProgressDialog(progressDialog, handler);
                }
            });
        }
    }).start();

}

  • 写回答

2条回答 默认 最新

  • 普通网友 2015-11-26 03:08
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题