-Android -线程池 批量上传图片 -附php接收代码

简介: (出处:http://www.cnblogs.com/linguanh/) 目录:   1,前序   2,类特点   3,用法   4,java代码   5,php代码     1,前序   还是源于重构,看着之前为赶时间写着的碎片化的代码,甚是悲剧,臃肿且长,其实重构也是一个提高的过程,重构过程中会接触到更多的知识点。

(出处:http://www.cnblogs.com/linguanh/)

目录:

  1,前序

  2,类特点

  3,用法

  4,java代码

  5,php代码

 

 

1,前序

  还是源于重构,看着之前为赶时间写着的碎片化的代码,甚是悲剧,臃肿且长,其实重构也是一个提高的过程,重构过程中会接触到更多的知识点。至少,我现在意识到,那怕是听过、有这样的意识而没真正动过手都是不行的,多线程并发最好使用线程池而不要一味地 new Thread(...).start()。下面我分享个自己刚写好的图片批量上传类,顺带server端接口代码,已经过测试,一套直接可用。

 

2,本类特点

  1、耦合度低,操作简单、使用时仅 6 行代码即可直接 批量上传完图片;

  2、使用的是软化线程池对象,内存消耗这方面可以放心地交给系统处理;

  3、采用链式操作,配置方便;

  4、自带上传函数,光学习这个都够了;

  5、懒人必备...

 

3,使用例子

new PicUpLoadExecutor(3)// 并发数       
     .withUpLoadUrl(url) // 服务端接口文件的url

.withHandler(handler) // 发完后发消息的handler
.exec(picBitmaps); // 要上传的图片bitmaps

4,client端java类

注释已经很丰富,不懂请留言

  1 package cn.share.bananacloud.post.send;
  2 
  3 import android.graphics.Bitmap;
  4 import android.os.Handler;
  5 import android.util.Log;
  6 
  7 import java.io.BufferedReader;
  8 import java.io.ByteArrayInputStream;
  9 import java.io.ByteArrayOutputStream;
 10 import java.io.DataOutputStream;
 11 import java.io.InputStream;
 12 import java.io.InputStreamReader;
 13 import java.lang.ref.SoftReference;
 14 import java.net.HttpURLConnection;
 15 import java.net.URL;
 16 import java.util.concurrent.ExecutorService;
 17 import java.util.concurrent.Executors;
 18 import java.util.concurrent.ThreadFactory;
 19 
 20 /**
 21  *  Created by 林冠宏 on 2016/4/30.
 22  *
 23  *  1,线程池批量上传图片类,选用 newFixedThreadPool
 24  *  2,以 Bitmap 数组为例子
 25  *  3,自定义一个 图片上传 函数
 26  *
 27  */
 28 
 29 public class PicUpLoadExecutor {
 30 
 31     private static final String TAG = "PicUpLoadHelper";
 32     public static final int UpLoadFinish = 0x321;
 33 
 34     /** 如果你不想内存不足是它们被gc掉,请换为强引用 */
 35     private SoftReference<ExecutorService> fixedThreadPool = null;
 36 
 37     /** 并发数>0 --1 ~ 128,用 short 足以 */
 38     private short poolSize = 1;
 39     private Handler handler = null;
 40     private ExecListenter ExecListenter;
 41     private String url = null;
 42 
 43     public PicUpLoadExecutor(short poolSize){
 44         fixedThreadPool = new SoftReference<ExecutorService>(Executors.newFixedThreadPool(poolSize));
 45     }
 46 
 47     public PicUpLoadExecutor(short poolSize,ThreadFactory threadFactory){
 48         fixedThreadPool = new SoftReference<ExecutorService>(Executors.newFixedThreadPool(poolSize,threadFactory));
 49     }
 50 
 51     /** 设置并发数 */
 52     /*public PicUpLoadExecutor withPoolSize(short poolSize){
 53         this.poolSize = poolSize;
 54         return this;
 55     }*/
 56 
 57     /** 设置图片总数,已直接换为图片数目 */
 58     /*public PicUpLoadHelper withPicSize(short poolSize){
 59         this.picSize = picSize;
 60         return this;
 61     }*/
 62 
 63     /** 设置图片上传路径 */
 64     public PicUpLoadExecutor withUpLoadUrl(String url){
 65         this.url = url;
 66         return this;
 67     }
 68 
 69     /** 设置handler */
 70     public PicUpLoadExecutor withHandler(Handler handler){
 71         this.handler = handler;
 72         return this;
 73     }
 74 
 75     /** 设置自定义 run 函数接口 */
 76     /*public PicUpLoadHelper withExecRunnableListenter(ExecRunnableListenter ExecRunnableListenter){
 77         this.ExecRunnableListenter = ExecRunnableListenter;
 78         return this;
 79     }*/
 80 
 81     /** 设置开始前接口 */
 82     public PicUpLoadExecutor withBeforeExecListenter(ExecListenter ExecListenter){
 83         this.ExecListenter = ExecListenter;
 84         return this;
 85     }
 86 
 87 
 88     public ExecutorService getFixedThreadPool(){
 89         return fixedThreadPool.get();
 90     }
 91 
 92     /** 开发原则--接口分离 */
 93 
 94     /** 自定义run接口 */
 95     public interface ExecRunnableListenter{
 96         void onRun(int i);
 97     }
 98 
 99     /** 开始任务前接口,没用到,可自行设置 */
100     public interface ExecListenter{
101         void onBeforeExec();
102     }
103 
104     /** 为减少 程序计数器 每次在循环时花费在 if else 的时间,这里还是 重载一次 好 */
105 
106     public void exec(final Bitmap[] bitmaps,final ExecRunnableListenter ExecRunnableListenter){
107         if(bitmaps==null){
108             return;
109         }
110         if(ExecRunnableListenter!=null){
111             int picNums = bitmaps.length;
112             for(int i=0;i<picNums;i++){
113                 /** 自定义执行上传任务 */
114                 final int picIndex = i;
115                 fixedThreadPool.get().execute(new Runnable() {
116                     @Override
117                     public void run() {
118                         ExecRunnableListenter.onRun(picIndex);
119                     }
120                 });
121             }
122         }
123     }
124 
125     public void exec(final Bitmap[] bitmaps){
126         if(bitmaps==null){
127             return;
128         }
129         int picNums = bitmaps.length;
130         for(int i=0;i<picNums;i++){
131             /** 默认执行上传任务 */
132             final int picIndex = i;
133             fixedThreadPool.get().execute(new Runnable() {
134                 @Override
135                 public void run() {
136                     /** 批量 上传 图片,此静态函数若有使用全局变量,必须要 加 synchronized */
137                     String json = uploadPic
138                             (
139                                     url,
140                                     "" + picIndex + ".jpg", /** 我自己情况的上传 */
141                                     bitmaps[picIndex]       /** 对应的图片流 */
142                             );
143                     if(json!=null){
144                         /** 服务器上传成功返回的标示, 自己修改吧,我这里是我的情况 */
145                         if(json.trim().equals("yes")){
146                             /** UpLoadFinish 是每次传完一张发信息的信息标示 */
147                             handler.sendEmptyMessage(UpLoadFinish);
148                         }
149                     }
150                     Log.d(TAG,"pic "+picIndex+" upLoad json ---> "+json);
151                 }
152             });
153         }
154     }
155 
156     /** 若有依赖全局变量必须加 synchronized */
157     /** 此函数采用 tcp 数据包传输 */
158     public static String uploadPic(String uploadUrl,String filename,Bitmap bit){
159         String end = "\r\n"; /** 结束符 */
160         String twoHyphens = "--";
161         String boundary = "******"; /** 数据包头,设置格式没强性要求 */
162         int compress=100; /** 压缩初始值 */
163         try{
164             HttpURLConnection httpURLConnection
165                     = (HttpURLConnection) new URL(uploadUrl).openConnection();
166             /** 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃 */
167             /** 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。*/
168             httpURLConnection.setChunkedStreamingMode(256 * 1024);// 256K
169 
170             httpURLConnection.setConnectTimeout(10*1000);
171             httpURLConnection.setDoInput(true);
172             httpURLConnection.setDoOutput(true);
173             httpURLConnection.setUseCaches(false);
174 
175             httpURLConnection.setRequestMethod("POST");
176             /** tcp链接,防止丢包,需要进行长链接设置 */
177             httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
178             httpURLConnection.setRequestProperty("Charset", "UTF-8");
179             httpURLConnection.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
180 
181             /** 发送报头操作,dos 也是流发送体 */
182             DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
183             dos.writeBytes(twoHyphens + boundary + end);
184             /** uploadedfile 是接口文件的接受流的键,client 和 server 要同步 */
185             dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
186                     + filename.substring(filename.lastIndexOf("/") + 1)
187                     + "\""
188                     + end);
189             dos.writeBytes(end);
190 
191             /** 下面是压缩操作 */
192             ByteArrayOutputStream baos = new ByteArrayOutputStream();
193             bit.compress(Bitmap.CompressFormat.JPEG, compress, baos);
194             while (baos.toByteArray().length / 1024 > 500) {
195                 Log.d(TAG,"compress time ");
196                 baos.reset();
197                 compress -= 10;
198                 if(compress==0){
199                     bit.compress(Bitmap.CompressFormat.JPEG, compress, baos);
200                     break;
201                 }
202                 bit.compress(Bitmap.CompressFormat.JPEG, compress, baos);
203             }
204 
205             /** 发送比特流 */
206             InputStream fis = new ByteArrayInputStream(baos.toByteArray());
207             byte[] buffer = new byte[10*1024]; // 8k+2k
208             int count = 0;
209             while ((count = fis.read(buffer)) != -1) {
210                 dos.write(buffer, 0, count);
211             }
212             fis.close();
213             dos.writeBytes(end);
214             dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
215             dos.flush();
216 
217             /** 获取返回值 */
218             InputStream is = httpURLConnection.getInputStream();
219             InputStreamReader isr = new InputStreamReader(is, "utf-8");
220             BufferedReader br = new BufferedReader(isr);
221             String result = br.readLine();
222 
223             Log.d(TAG, "send pic result "+result);
224             dos.close();
225             is.close();
226             return result;
227         } catch (Exception e){
228             e.printStackTrace();
229             Log.d(TAG, e.toString());
230             return null;
231         }
232     }
233 }
View Code

5,server端接受代码 php

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: Administrator
 5  * Date: 2016/4/30
 6  * Time: 15:37
 7  */
 8 
 9 // $_FILES['uploadedfile']['name'] 是传过来的图片名称
10 
11 $target_path = "要保存到的路径";
12 
13 if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
14     echo "yes";
15 }  else{
16     echo "no";
17 }
18 
19 
20 ?>

 

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
目录
相关文章
|
12天前
|
PHP 开发者
PHP中的异常处理:提升代码的健壮性
【8月更文挑战第27天】在PHP编程的世界里,异常处理是一块基石,它确保我们的应用程序在遇到不可预见的错误时不会崩溃,而是能够优雅地处理这些情况。本文将深入探讨PHP的异常处理机制,通过实际示例展示如何捕获和处理异常,以及如何利用自定义异常来增强代码的可读性和可维护性。我们将从基础的try-catch结构出发,逐步过渡到更高级的话题,如异常链和错误日志记录,旨在为读者提供一套完整的异常处理策略。
|
2天前
|
PHP
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第5天】在PHP编程中,异常处理是确保应用稳定性和可靠性的关键机制。本文将深入探讨如何使用PHP的异常处理来捕捉错误、清理资源并优雅地恢复程序流程,同时通过实际代码示例展示如何实现这一过程。
|
2天前
|
IDE PHP 开发工具
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第5天】在PHP编程中,异常处理是一种强大的错误管理机制,允许开发者编写更加清晰、可维护的代码。本文将深入探讨PHP的异常处理,从基础概念到高级应用,旨在指导读者如何通过异常处理来提高代码质量,避免常见的陷阱,并实现更优雅的错误处理策略。
|
10天前
|
PHP
PHP中的面向对象编程:构建更高效的代码
【8月更文挑战第29天】在PHP的世界中,面向对象编程(OOP)是提升代码可维护性、可扩展性和复用性的利器。本文将通过浅显易懂的方式,带领读者探索PHP中OOP的核心概念,并通过实际代码示例揭示如何利用这些概念来编写更加高效和优雅的代码。无论你是PHP新手还是希望深化理解的老手,这篇文章都将为你打开一扇新窗,让你看到编码的艺术与哲学。
|
12天前
|
数据处理 PHP 开发者
PHP中的数组操作技巧:提高代码效率与可读性
【8月更文挑战第27天】在PHP开发中,数组是数据处理的核心。掌握数组的操作不仅能提升代码的执行效率,还能增强代码的可读性。本文将通过实际的编码示例,展示如何在PHP中高效地使用数组,包括数组的创建、遍历、排序、查找和过滤等常用操作,以及一些高级技巧,如使用匿名函数和数组的解构赋值。无论你是新手还是有经验的开发者,这些技巧都将对你的PHP编程之旅大有裨益。
|
15天前
|
设计模式 算法 PHP
深入理解PHP中的数组操作探索编程之美:从代码到架构的思维转变
【8月更文挑战第24天】在PHP编程中,数组是基础且强大的数据结构。本文将通过浅显易懂的方式,介绍如何在PHP中高效地操作数组,包括创建、遍历、排序和过滤等常见任务。无论你是初学者还是有经验的开发者,这篇文章都会带给你新的启示。 【8月更文挑战第24天】在编程的世界中,代码不仅仅是冰冷的字符排列,它承载着思想、解决问题的智慧和创新的灵魂。本文将通过个人的技术感悟,带领读者从编写单一功能的代码片段出发,逐步深入到整个软件架构的设计哲学,探索如何将代码块转化为高效、可维护和可扩展的系统。我们将一起见证,当代码与架构思维相结合时,如何引发技术实践的革命性飞跃。
|
15天前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
26天前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
27天前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
34 4
|
8天前
|
PHP UED 开发者
PHP中的异常处理:提升代码的健壮性
【8月更文挑战第31天】在编程的世界里,异常就像是不请自来的客人,总是在不经意间打乱我们的计划。PHP作为一门流行的后端开发语言,提供了一套异常处理机制来帮助我们优雅地应对这些不速之客。本文将带你了解如何在PHP中捕获和处理异常,确保你的应用程序即使在面对意外情况时也能稳健运行。我们将通过实际的代码示例,展示如何实施有效的异常处理策略,以及如何利用自定义异常类来增强代码的可读性和可维护性。准备好迎接那些不请自来的“客人”了吗?让我们一起深入PHP的异常世界,学习如何将这些意外转化为我们的优势。