安卓 加载网络图并下载
1,最近暂时不忙,终于有时间学习复习知识点了, 发现自己对于网络加载图并且下载不熟悉,于是乎补习了一下,嗯 下面我就说具体代码吧。
2,首先添加布局代码:
<ImageView
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_margin="15dp"
android:id="@+id/iv_pic"
android:src="@mipmap/ic_launcher"></ImageView>
<Button
android:id="@+id/bt_download"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
android:text="下载图片" />
3,然后呢 添加 点击事件准备执行:
//加载网络图片 并且存储本地
btn_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyAsyncTask myAsyncTask=new MyAsyncTask(iv_pic,progressDialog);
myAsyncTask.execute(path);
}
});
4,最后呢,是关键的代码,我就直接全部复制了,哈哈哈哈:
package com.example.myviewtwo.study.threen;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Random;
public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {
private ImageView iv_pic;
private ProgressDialog progressBarDialog;
boolean isDownload=false;
private int progress333;
private int downloadCount;
private String mSavePath;
public MyAsyncTask(ImageView imageView, ProgressDialog p) {
iv_pic = imageView;
progressBarDialog = p;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("info", "准备执行");
progressBarDialog.setTitle("当前任务");
progressBarDialog.setMessage("正在下载图片,请稍后...");
progressBarDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条样式,横项
progressBarDialog.show();
}
@Override
protected Bitmap doInBackground(String... params) {
Log.d("info", "开始执行");
String path=params[0];
Log.d("info","提交的访问图片地址是==="+path);
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory() + "/";
mSavePath = sdpath + "download";
File file = new File(mSavePath);
// 判断文件目录是否存在
if (!file.exists()) {
file.mkdir();
}
Bitmap bitmap=getBitmap(path);
return bitmap;
}
public Bitmap getBitmap(String url) {
Bitmap bm = null;
try {
URL iconUrl = new URL(url);
URLConnection conn = iconUrl.openConnection();
HttpURLConnection http = (HttpURLConnection) conn;
int length = http.getContentLength();
conn.connect();
// 获得图像的字符流
InputStream is = conn.getInputStream();
//获取图片 并且显示
BufferedInputStream bis = new BufferedInputStream(is, length);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();// 关闭流
}
catch (Exception e) {
e.printStackTrace();
}
return bm;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.d("info", "显示进度");
progressBarDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
Log.d("info", "执行返回结果");
progressBarDialog.dismiss();
iv_pic.setImageBitmap(bitmap);
//保存到本地
SavaImage(bitmap);
}
/**
* 保存位图到本地
* @param bitmap
* @return void
*/
public void SavaImage(Bitmap bitmap){
File file=new File(mSavePath);
FileOutputStream fileOutputStream=null;
//文件夹不存在,则创建它
if(!file.exists()){
file.mkdir();
}
try {
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
fileOutputStream=new FileOutputStream(mSavePath+"/"+System.currentTimeMillis()+".jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100,fileOutputStream);
fileOutputStream.close();
Log.d("info","图片下载完成了");
}else{
Log.d("info","没有文件写入权限");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
OK ,兄弟们,这就是代码了,具体的你们一看便知道,不过我还是觉得不够好,后期自己再优化吧。感谢收看 ,