//bitmap圖片集合
private ArrayList<Bitmap> bitmapArrayList = new ArrayList<>();
RequestOptions requestOptions = new RequestOptions()
.transform(new GlideRoundTransform(mContext, radius, cornerType));
GlideApp.with(mIvImg.getContext())
.asBitmap()
.load(url)
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model,
Target<Bitmap> target, boolean isFirstResource) {
return true;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target,
DataSource dataSource, boolean isFirstResource) {
bitmapArrayList.add(resource);
return false;
}
})
.apply(requestOptions)
.placeholder(ImageUtils.getDefaultImage())
.into(mIvImg);
//循環遍歷圖片資源集合,而後開始保存圖片到本地文件夾
mBitmap = bitmapArrayList.get(i);
savePath = FileSaveUtils.getLocalImgSavePath();
FileOutputStream fos = null;
try {
File filePic = new File(savePath);
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
filePic.createNewFile();
}
fos = new FileOutputStream(filePic);
// 100 圖片品質爲滿
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//刷新相冊
if (isScanner) {
scanner(context, savePath);
}
}
複製代碼
/**
* 請求網絡圖片
* @param url url
* @return 將url圖片轉化成bitmap對象
*/
private static long time = 0;
public static InputStream HttpImage(String url) {
long l1 = System.currentTimeMillis();
URL myFileUrl = null;
Bitmap bitmap = null;
HttpURLConnection conn = null;
InputStream is = null;
try {
myFileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(5000);
conn.setDoInput(true);
conn.connect();
is = conn.getInputStream();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
conn.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
long l2 = System.currentTimeMillis();
time = (l2-l1) + time;
LogUtils.e("毫秒值"+time);
//保存
}
return is;
}
複製代碼
InputStream inputStream = HttpImage(
"https://img1.haowmc.com/hwmc/material/2019061079934131.jpg");
String localImgSavePath = FileSaveUtils.getLocalImgSavePath();
File imageFile = new File(localImgSavePath);
if (!imageFile.exists()) {
imageFile.getParentFile().mkdirs();
try {
imageFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos = null;
BufferedInputStream bis = null;
try {
fos = new FileOutputStream(imageFile);
bis = new BufferedInputStream(inputStream);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
複製代碼
File file = Glide.with(ReflexActivity.this)
.load(url.get(0))
.downloadOnly(500, 500)
.get();
複製代碼
String localImgSavePath = FileSaveUtils.getLocalImgSavePath();
File imageFile = new File(localImgSavePath);
if (!imageFile.exists()) {
imageFile.getParentFile().mkdirs();
imageFile.createNewFile();
}
copy(file,imageFile);
/**
* 複製文件
*
* @param source 輸入文件
* @param target 輸出文件
*/
public static void copy(File source, File target) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(source);
fileOutputStream = new FileOutputStream(target);
byte[] buffer = new byte[1024];
while (fileInputStream.read(buffer) > 0) {
fileOutputStream.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
複製代碼
ArrayList<String> images = new ArrayList<>();
for (String image : images){
//使用該線程池,及時run方法中執行異常也不會崩潰
PoolThread executor = BaseApplication.getApplication().getExecutor();
executor.setName("getImage");
executor.execute(new Runnable() {
@Override
public void run() {
//請求網絡圖片並保存到本地操做
}
});
}
複製代碼
ArrayList<String> images = new ArrayList<>();
ApiService apiService = RetrofitService.getInstance().getApiService();
//注意:此處是保存多張圖片,能夠採用異步線程
ArrayList<Observable<Boolean>> observables = new ArrayList<>();
final AtomicInteger count = new AtomicInteger();
for (String image : images){
observables.add(apiService.downloadImage(image)
.subscribeOn(Schedulers.io())
.map(new Function<ResponseBody, Boolean>() {
@Override
public Boolean apply(ResponseBody responseBody) throws Exception {
saveIo(responseBody.byteStream());
return true;
}
}));
}
// observable的merge 將全部的observable合成一個Observable,全部的observable同時發射數據
Disposable subscribe = Observable.merge(observables).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean b) throws Exception {
if (b) {
count.addAndGet(1);
Log.e("yc", "download is succcess");
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("yc", "download error");
}
}, new Action() {
@Override
public void run() throws Exception {
Log.e("yc", "download complete");
// 下載成功的數量 和 圖片集合的數量一致,說明所有下載成功了
if (images.size() == count.get()) {
ToastUtils.showRoundRectToast("保存成功");
} else {
if (count.get() == 0) {
ToastUtils.showRoundRectToast("保存失敗");
} else {
ToastUtils.showRoundRectToast("因網絡問題 保存成功" + count + ",保存失敗" + (images.size() - count.get()));
}
}
}
}, new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
Log.e("yc","disposable");
}
});
private void saveIo(InputStream inputStream){
String localImgSavePath = FileSaveUtils.getLocalImgSavePath();
File imageFile = new File(localImgSavePath);
if (!imageFile.exists()) {
imageFile.getParentFile().mkdirs();
try {
imageFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos = null;
BufferedInputStream bis = null;
try {
fos = new FileOutputStream(imageFile);
bis = new BufferedInputStream(inputStream);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
//刷新相冊代碼省略……
}
}
複製代碼