您的位置:首页 > 其它

AysncTask实现异步下载图片

2016-09-18 17:04 295 查看
目录:
1.概述
2.异步下载图片代码实现

1.概述:
除了通过handler+Thread实现异步访问网络实现更新UI之外,还可以通过AsyncTask实现,至于他们的应用场景和各自的优缺点

在之前写过一篇关于handler+Thread异步下载图片中有讲解,地址:http://blog.csdn.net/qq_28057577/article/details/52496025

这里就不重复了。

2.异步下载图片代码实现

2.1 效果图







2.2 主布局activity_async.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView2" />

<Button
android:layout_below="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AnyscTask异步获取图片"
android:id="@+id/button2" />
</RelativeLayout>

2.3 主布局类AyncMainActivity.java
package com.example.com.example.async;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.example.R;

/**
* Created by elimy on 2016-09-09.
*/
public class AsyncMainActivity extends AppCompatActivity {
private ImageView imageView2;
private Button button2;
private DownloadAsyncTask mAsyncTask;
private String image_url = "https://photo.tuchong.com/1447577/g/9211949.jpg";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_anysc);
//初始化控件
imageView2 = (ImageView) findViewById(R.id.imageView2);
button2 = (Button) findViewById(R.id.button2);
//设置监听器
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//初始化自定义AsyncTask类实例
mAsyncTask = new DownloadAsyncTask(imageView2,AsyncMainActivity.this);
//传入图片地址,执行异步获取图片操作
mAsyncTask.execute(image_url);
}
});
}
}

2.4 实现异步访问下载的类DownloadAsyncTask.java
package com.example.com.example.async;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* Created by elimy on 2016-09-09.
* 参数:<Params, Progress, Result>
*  String:表示传入参数的数据类型
*  Integer:表示更新进度值得数据类型
*  Bitmap:表示返回值的数据类型
*  如果没有传入参数可设置为Void类型
*/
public class DownloadAsyncTask extends AsyncTask<String,Integer,Bitmap> {
private  ImageView imageView;
private Context context;
private Bitmap bitmap;
private ProgressDialog progressDialog;
public DownloadAsyncTask(ImageView imageview,Context context) {
this.imageView = imageview;
this.context = context;
}
/*
* 线程执行最开始时候调用,在UI线程中执行
* 一般执行一些预操作比如显示进度条
* */
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("加载图片");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("图片加载中,请稍后...");
//设置可以按back键返回
progressDialog.setCancelable(true);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
//弹出progressDialog并设置进度值为0
progressDialog.show();
progressDialog.setProgress(0);
imageView.setImageBitmap(null);
super.onPreExecute();
}

/*
* 在onPreExecute方法调用后立即调用,用来执行一些耗时的后台操作
* */
@Override
protected Bitmap doInBackground(String... params) {
try {
//调用onProgressUpdate更新一次进度条
publishProgress(0);
//创建URL类并初始化
URL url = new URL(params[0]);
//获取链接对象
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//设置请求方式
urlConnection.setRequestMethod("GET");
//设置允许接收输入
urlConnection.setDoInput(true);
//设置超时
urlConnection.setConnectTimeout(5*1000);
//暂停5s模拟请求耗时,方便观察进度条
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(50);
//在此更新一次进度条
if (urlConnection.getResponseCode() == 200){
//获取响应输入数据
InputStream is = urlConnection.getInputStream();
//将响应数据转换成位图类型
bitmap = BitmapFactory.decodeStream(is);
publishProgress(100);
}else {
Log.d("request","请求失败");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/*
* 在后台操作结束后接收返回结果,在UI线程中调用
* */
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
//设置图片到UI显示
imageView.setImageBitmap(bitmap);
Toast.makeText(context,"获取图片成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,"获取图片失败",Toast.LENGTH_SHORT).show();
}
}
/*
* 更新进度,调用publishProgress之后被调用
* */
@Override
protected void onProgressUpdate(Integer... values) {
//更新进度条
progressDialog.setProgress(values[0]);
//cancel掉进度条弹框
if (progressDialog.getProgress() == 100){
progressDialog.cancel();
}
super.onProgressUpdate(values);
}

/*
* 取消异步线程,当UI线程调用AsyncTask的cancel方法时调用,在UI线程中运行
* 比如这里如果在加载图片的过程中用户不想加载了,点击了取消加载图片(假如加载有点
* 缓慢)这个时候就会触发UI线程的cancel方法从而调用此方法,做一些善后的处理
*
* */
@Override
protected void onCancelled(Bitmap bitmap) {
//cancel掉弹框
progressDialog.cancel();
super.onCancelled(bitmap);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息