用HTTP加载图片在屏幕上显示
layout代码
<Button
android:id="@+id/eeee_download"
android:layout_width="match_parent"
android:layout_height="100dp"
android:textSize="30sp"
android:text="点击下载"
/>
<ImageView
android:id="@+id/eeee_downloadimg"
android:layout_below="@+id/eeee_download"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainActivity 代码
public class MainActivity extends AppCompatActivity {
Button btn1;
ImageView img1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
}
private void bindID() {
btn1 = findViewById(R.id.eeee_download);
img1 = findViewById(R.id.eeee_downloadimg);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个方法DownloadTask
ImageLoadTask task = new ImageLoadTask(MainActivity.this, btn1, img1);
task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
}
});
}
}
ImageLoadTask
//外部类,可以复用
//第一个参数用String,因为传值需要用execute,是String类型的
public class ImageLoadTask extends AsyncTask<String, Integer, Bitmap> {
private Context context;
private Button btn;
private ImageView img;
//加载网络图片需要用到Bitmap对象
private Bitmap bitmap;
//在外面单独创建一个类,需要一个构造方法来调用。
//为什么需要构造方法——有传值的需求
public ImageLoadTask(MainActivity mainActivity, Button btn, ImageView img) {
this.context = mainActivity;
this.btn = btn;
this.img = img;
}
@Override
protected Bitmap doInBackground(String... strings) {
//加载网络图片,最后获得一个Bitmap对象,返回Bitmap对象
try {
//创建URL对象,
// 接收的对象是task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
URL url = new URL(strings[0]);
//通过URL对象得到HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//得到输入流
InputStream inputStream = connection.getInputStream();
//把输入流转换成Bitmap类型对象
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
img.setImageBitmap(bitmap);
}
}
注意:创建外部类的好处是代码的复用性。
用HTTPConnection方法请求下载网络图片并下载
layout布局文件:
<Button
android:id="@+id/eigthbtn"
android:textSize="30sp"
android:text="点击下载"
android:layout_width="match_parent"
android:layout_height="80dp" />
<ImageView
android:id="@+id/eigthimg"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Main8Activity代码:
public class Main8Activity extends AppCompatActivity {
private Button btn;
PermissionHelper permissionHelper;
private ImageView img;
private String picUrl="http://img03.sogoucdn.com/app/a/100520093/9243fbcd523532c7-65a10dc900adf004-16cb2e34a14409c94f53ee8772786500.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
btn=findViewById(R.id.eigthbtn);
img=findViewById(R.id.eigthimg);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
permissionHelper=new PermissionHelper(Main8Activity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
permissionHelper.request(new PermissionHelper.PermissionCallback() {
@Override
public void onPermissionGranted() {
//获取到了权限
Task8 task8=new Task8(Main8Activity.this,img);
task8.execute(picUrl,"2qw7.jpg");
}
@Override
public void onIndividualPermissionGranted(String[] grantedPermission) {
}
@Override
public void onPermissionDenied() {
}
@Override
public void 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);
}
}
}
需要继承AsyncTask的外部类:
public class Task8 extends AsyncTask<String,Integer,Integer> {
private String dirPath;//下载图片目录,例如/root/pic/
private String filePath;//文件存储具体位置
private Context context;
private ImageView img;
public Task8(Context context, ImageView img) {
this.context=context;
this.img=img;
}
@Override
protected Integer doInBackground(String... strings) {
//文件名传参
String fileName=strings[1];
//搜寻外部目录
dirPath= Environment.getExternalStorageDirectory()+"/"+"down_pics/";
//创建目录对象是否存在
File dir=new File(dirPath);
if(!dir.exists()){
//新建目录
dir.mkdir();
}
//判断文件是否存在
filePath=dirPath+strings[1];
File file=new File(filePath);
if(file.exists()){
return -1;
}
else {
try {
//文件不存在的话创建文件
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/*****/
//文件输入输出流
InputStream inputStream=null;
FileOutputStream 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 bmg= BitmapFactory.decodeFile(filePath);
img.setImageBitmap(bmg);
break;
case -1:
Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
break;
}
}
}
注意:
Environment.getExternalStorageDirectory():内置SD卡环境;
getResponseCode():客户端发出请求,如果连接成功,就会有响应码code,如果code=200,说明服务器端成功响应。如果在Android4.x中,即使连接成功,响应码为空,不提示任何错误;
本文介绍如何在Android应用中使用HTTP加载并显示图片,包括在布局中设置图片及通过HTTPConnection方法请求下载网络图片的步骤。强调了HTTPConnection请求下载时的响应码检查以及代码复用性的重要性。
1595

被折叠的 条评论
为什么被折叠?



