Android进阶之动态加载图片(AsyncTask异步加载并显示进度条)
2015-09-18 09:26
796 查看
1、权限
2、activity_bitmap_async_task.xml
3、AsyncTaskBitmapActivity.java
简单使用方法
AsyncTaskBitmapActivity
4、效果图
<!-- 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、效果图
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories