使用HttpURLConnection加载网络图片
效果图展示
注意点:
01、加载网络图片需要用到Bitmap
02、加载网络图片有时候比较耗时,可以用Handler或AsyncTask来解决
代码展示(AsyncTask)
//在xml文件中
<Button
android:id="@+id/main2_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载图片"/>
<ImageView
android:id="@+id/main2_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
//在Activity中
public class Main2Activity extends AppCompatActivity {
private Button showBtn;
private ImageView webimgView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bindID();
showBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImgLoadTask imgLoadTask=new ImgLoadTask(webimgView);
imgLoadTask.execute("http://p2.so.qhimgs1.com/bdr/_240_/t01b20aa81f9cd5a5f2.jpg");//execute里面是图片的地址
}
});
}
private void bindID() {
showBtn=findViewById(R.id.main2_btn);
webimgView=findViewById(R.id.main2_image);
}
}
//在ImgLoadTask.java中
public class ImgLoadTask extends AsyncTask<String,Integer,Bitmap>{
private ImageView imageView;
//为什么要加一个构造方法--有传值的需求
public ImgLoadTask(ImageView imageView1){
this.imageView=imageView1;
}
@Override
protected Bitmap doInBackground(String... strings) {
//加载网络图片,最后获取到一个Bitmap对象,返回Bitmap对象
Bitmap bmp=null;
try {
//创建URL对象
URL url=new URL(strings[0]);
//通过URL对象得到HttpURLConnection
HttpURLConnection connection= (HttpURLConnection) url.openConnection();(//这边需要强制转换)
//得到输入流
InputStream inputStream=connection.getInputStream();
//把输入流转换成Bitmap类型对象
bmp= BitmapFactory.decodeStream(inputStream);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);
}
}
二 、使用HttpURLConnection下载网络图片并显示
效果展示图
代码展示
//在布局文件中
<Button
android:id="@+id/web_downbtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载图片"/>
<ImageView
android:id="@+id/down_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/web_downbtn"
/>
如果要在安卓6.0以上运行,要进行权限设置(以下代码就是6.0以上的)
首先在build.gradle中编译
compile ‘com.master.android:permissionhelper:1.3’
然后在Activity中写入以下代码
public class HelloActivity extends AppCompatActivity {
private String TAG = "HelloActivity";
private PermissionHelper permissionHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
permissionHelper = new PermissionHelper(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
permissionHelper.request(new PermissionHelper.PermissionCallback() {
@Override
public void onPermissionGranted() {
//全都授权
Log.e(TAG,"onPermissionGranted...");
}
@Override
public void onIndividualPermissionGranted(String[] grantedPermission) {
//某个授权
Log.e(TAG,"onIndividualPermissionGranted() called with: grantedPermission = [" + TextUtils.join(",",grantedPermission) + "]");
}
@Override
public void onPermissionDenied() {
//某个拒绝
Log.e(TAG,"onPermissionDenied...");
}
@Override
public void onPermissionDeniedBySystem() {
//用户选择了"不再询问"后,点击"拒绝按钮",执行此方法
Log.e(TAG,"onPermissionDeniedBySystem...");
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissionHelper != null) {
permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
//在Activity中
public class Main5Activity extends AppCompatActivity {
private Button downbtn;
private ImageView imageView;
private String TAG = "HelloActivity";
private PermissionHelper permissionHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
permissionHelper = new PermissionHelper(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
permissionHelper.request(new PermissionHelper.PermissionCallback() {
@Override
public void onPermissionGranted() {
//全都授权
bindID();
downbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DownTask downTask=new DownTask(Main5Activity.this,imageView);
downTask.execute("http://p5.so.qhimgs1.com/bdr/_240_/t017e2f48ce6aeed19b.jpg","qhjwp.jpg");
}
});
Log.e(TAG,"onPermissionGranted...");
}
@Override
public void onIndividualPermissionGranted(String[] grantedPermission) {
//某个授权
Log.e(TAG,"onIndividualPermissionGranted() called with: grantedPermission = [" + TextUtils.join(",",grantedPermission) + "]");
}
@Override
public void onPermissionDenied() {
//某个拒绝
Log.e(TAG,"onPermissionDenied...");
}
@Override
public void onPermissionDeniedBySystem() {
//用户选择了"不再询问"后,点击"拒绝按钮",执行此方法
Log.e(TAG,"onPermissionDeniedBySystem...");
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissionHelper != null) {
permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
private void bindID() {
downbtn=findViewById(R.id.web_downbtn);
imageView=findViewById(R.id.down_img);
}
}
//在DownTask中
public class DownTask extends AsyncTask<String,Integer,Integer> {
private String dirPath;//下载图片的目录
private String filePath;//下载图片的文件地址(存储位置)
private Context context;//上下文环境
private ImageView imageView;
//构造方法
public DownTask(Context context,ImageView imageView){
this.context=context;
this.imageView=imageView;
}
@Override
protected Integer doInBackground(String... strings) {
String fileName=strings[1];
//判断目录是否存在,若不存在,则创建目录
dirPath = Environment.getExternalStorageDirectory() + "/download_pics/";
//创建目录对象
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdir();
}
//判断文件是否存在,若不存在,创建文件
filePath=dirPath+fileName;//文件路径
File file=new File(filePath);//创建文件对象
if (file.exists()){
return -1;
}
else {
try {
file.createNewFile();//不存在就创建出这个文件
} catch (IOException e) {
e.printStackTrace();
}
}
//创建输入流和输出流
InputStream inputStream=null;
OutputStream outputStream=null;
try {
URL url=new URL(strings[0]);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//判断返回码是否正常,若正常创建输入流,否则就直接返回
if (connection.getResponseCode()==200){
inputStream=connection.getInputStream();
}else {
return -2;
}
outputStream=new FileOutputStream(file);
int length=0;
//缓冲区
byte[] buffer=new byte[4*1024];
while ((length=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer){
case 1:
//正常下载完成
Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
Bitmap bm= BitmapFactory.decodeFile(filePath);
imageView.setImageBitmap(bm);
break;
case -1:
//文件已存在
Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
break;
case -2:
//网络异常
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
break;
}
}
}