写博客总是三天打鱼,,两天晒网....今天又来补补Android开发的内容
之前在完成ImageView浏览图片的时候,还有一块内容忘了总结了,就是ListView中显示缩略图时,异步加载图片的功能。
这个功能应用在网络上获取图片时比较多。我是在打开预览图片界面的时候,发现图片很多的情况下打开很慢,,由于我压缩bitmap的效率比较低..所以我在这里另外开了一个线程来获得listview中的bitmap,这样打开界面就很快了。
这里使用的是AsyncTask类,可以直接操作控件
需要重写两个函数,如下
doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
所以我们就在doInBackground函数中通过图片文件名得到Bitmap对象,然后在onPostExecute中将bitmap显示在ImageVIew中。。。就ok~
- public class BmpAsyncTask extends AsyncTask<String, Void, Bitmap> {
- private final WeakReference<ImageView> imageViewReference;
- private String data = "";
- private ImageView mImgView;
- private List<Bitmap> mListBmp;
- public BmpAsyncTask(ImageView imageView, List<Bitmap> listBmp) {
- imageViewReference = new WeakReference<ImageView>(imageView);
- mImgView = imageView;
- mListBmp = listBmp;
- }
- @Override
- protected Bitmap doInBackground(String... params) {
- data = params[0];
- File file = new File(data);
- Bitmap bmp = null;
- // System.out.println("data:"+data);
- if (data.endsWith(".jpg") || data.endsWith(".png")) {
- bmp = PublicMethod.getBitmapFromFile(file, mImgView.getWidth(),
- mImgView.getWidth());
- } else if (data.endsWith(".mp4")) {
- bmp = ThumbnailUtils.createVideoThumbnail(data,
- MediaStore.Images.Thumbnails.MINI_KIND);
- }
- // bmp=ThumbnailUtils.extractThumbnail(bmp, 100, 100,
- // ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
- mListBmp.add(bmp);
- return bmp;
- }
- @Override
- protected void onPostExecute(Bitmap bitmap) {
- if (imageViewReference != null && bitmap != null) {
- final ImageView imageView = imageViewReference.get();
- if (imageView != null) {
- imageView.setImageBitmap(bitmap);
- }
- }
- }
- }
调用上述线程只要通过构造函数和execute方法传入参数即可。
- BmpAsyncTask bmpTask = new BmpAsyncTask(imgView, m_listBmp);
- bmpTask.execute(file.getAbsolutePath());