您的位置:首页 > 移动开发 > Android开发

Android进阶之动态加载图片(AsyncTask异步加载并显示进度条)

2015-09-18 09:26 796 查看
1、权限

<!-- Internet权限 -->
<uses-permission android:name="android.permission.INTERNET" >


2、activity_bitmap_async_task.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<Button
android:id="@+id/execute"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="execute" />

<Button
android:id="@+id/cancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="cancel" />

<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0" />

<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

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

</LinearLayout>


3、AsyncTaskBitmapActivity.java

简单使用方法

/**
* AsyncTask下载图片
*/
private class DownloadImageTask extends AsyncTask<String, Void, Drawable> {

@Override
protected Drawable doInBackground(String... params) {
return loadDrawableImage(params[0]);
}

@Override
protected void onPostExecute(Drawable drawable) {
super.onPostExecute(drawable);
imageView.setImageDrawable(drawable);
}
}


AsyncTaskBitmapActivity

package com.example.threads;

public class AsyncTaskBitmapActivity extends Activity {

ProgressBar progressBar;
TextView textView;
ImageView imageView;
Button execute;
Button cancel;
private MyTask mTask;
private static final String TAG = "TAG";
private final String IMAGE_URL = "http://h.hiphotos.baidu.com/news/q%3D100/sign=be8e90f30cfa513d57aa68de0d6d554c/c75c10385343fbf29d10a30cb47eca8065388fe4.jpg";
public static String uri = "http://172.28.89.98:8080/ServerExchange/servlet/GetImageServlet?id=1";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bitmap_async_task);

initVariable();
}

/**
* @description 初始化变量
*/
public void initVariable() {
execute = (Button) findViewById(R.id.execute);
cancel = (Button) findViewById(R.id.cancel);
textView = (TextView) findViewById(R.id.text_view);
imageView = (ImageView) findViewById(R.id.iv_bitmap);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);

execute.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

// 注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常
mTask = new MyTask();
mTask.execute(uri);
// mTask.execute(IMAGE_URL);

execute.setEnabled(false);
cancel.setEnabled(true);
}
});

cancel.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// 取消一个正在执行的任务,onCancelled方法将会被调用
mTask.cancel(true);
}
});
}

/**
* AsyncTask<Params, Progress, Result>
* 两个必须重写的方法:
* doInBackground(String... params)
* onPostExecute(Bitmap result)
*/
private class MyTask extends AsyncTask<String, Integer, Bitmap> {

/**
* onPreExecute方法用于在执行后台任务前做一些UI操作
*/
@Override
protected void onPreExecute() {
super.onPreExecute();

textView.setText("loading...");
}

/**
* doInBackground方法内部执行后台任务,不可在此方法内修改UI
*
* @param params
* @return
*/
@Override
protected Bitmap doInBackground(String... params) {

Bitmap bitmap = null;
InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;
URL url = null;
HttpURLConnection urlConnection = null;

try {

/**
* Get方法 HttpURLConnection
*/
url = new URL(params[0]);
// 打开连接
urlConnection = (HttpURLConnection) url.openConnection();
// 设置可以读取
urlConnection.setDoInput(true);
// 设置请求类型
urlConnection.setRequestMethod("GET");
// 连接
urlConnection.connect();
// 响应状态
int responseCode = urlConnection.getResponseCode();
// 获取图片流
inputStream = urlConnection.getInputStream();

if (responseCode == HttpStatus.SC_OK) {
outputStream = new ByteArrayOutputStream();
// 获取文件流大小,用于更新进度
long total = urlConnection.getContentLength();
byte[] buffer = new byte[1024];
int count = 0;
int length = -1;

// inputStream流在减少,outputStream流在增加
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
count += length;
// 调用publishProgress公布进度,最后onProgressUpdate方法将被执行
publishProgress((int) ((count / (float) total) * 100));
// 睡眠0.5秒,突出效果
Thread.sleep(100);
}
}

byte[] data = outputStream.toByteArray();
if (data != null) {
// 图片流转化为图片
bitmap = BitmapFactory
.decodeByteArray(data, 0, data.length);
}
} catch (Exception e) {

} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return bitmap;

/**
* Get方法 HttpClient
*/
// try {
// HttpClient client = new DefaultHttpClient();
// HttpGet get = new HttpGet(params[0]);
// HttpResponse response = client.execute(get);
// if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
// {
// HttpEntity entity = response.getEntity();
// InputStream inStream = entity.getContent();
// long total = entity.getContentLength();
// ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// byte[] buffer = new byte[1024];
// int count = 0;
// int length = -1;
//
// while ((length = inStream.read(buffer)) != -1) {
// outStream.write(buffer, 0, length);
// count += length;
// // 调用publishProgress公布进度,最后onProgressUpdate方法将被执行
// publishProgress((int) ((count / (float) total) * 100));
// // 为了演示进度,休眠500毫秒
// Thread.sleep(500);
// }
//
// byte[] data = outStream.toByteArray();
// if (data != null) {
// Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
// data.length);
// return bitmap;
// }
// }
// } catch (Exception e) {
// Log.e(TAG, e.getMessage());
// }
// return bitmap;
}

/**
* onProgressUpdate方法用于更新进度信息
*
* @param progresses
*/
@Override
protected void onProgressUpdate(Integer... progresses) {

progressBar.setProgress(progresses[0]);
textView.setText("loading..." + progresses[0] + "%");
}

/**
* onPostExecute方法用于在执行完后台任务后更新UI,显示结果
*
* @param result
*/
@Override
protected void onPostExecute(Bitmap bitmap) {

imageView.setImageBitmap(bitmap);
execute.setEnabled(true);
cancel.setEnabled(false);
}

/**
* onCancelled方法用于在取消执行中的任务时更改UI
*/
@Override
protected void onCancelled() {

textView.setText("cancelled");
progressBar.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
}

}


4、效果图

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