Android 异步加载图片
来源:互联网 发布:先学c还是先学java 编辑:程序博客网 时间:2024/06/05 03:28
1.构建AsyncTask子类参数:
有三个泛型参数:AsyncTask<Params,Progress,Result>
指定三个泛型参数:params:启动任务时输入参数类型;
Progress:后台执行中返回进度值类型
Result:后台执行任务完成后返回结果类型
2.构建AsyncTask 子类回调方法:
doInBackground();必须重写,后台线程将要完成的任务;
doPreExecute:完成初始化操作;
doPostExecute:doInBackground()中返回值传递给该方法;
onProgressUpdate():在doInBackground()方法中调用publishProgress()方法,更新任务执行进度后,就会触发该方法。
3.AsyncTask 使用的注意要点:
(1)必须在UI 线程中创建实例,调用execute()方法;
(2)每个AsyncTask 只能够调用execute()方法一次,不能重复调用;
(3)只有doInBackground()在其他线程中,不能直接更新UI,其他回调方法可以更新UI.
(4)AsyncTask底层还是线程池,当前面task没有完成,后面也不会执行,所以要有个cancel task 的步骤。
但是要注意task.cancel(true)方法只是将task标记为cancel,所以在其他回调方法中需要检查isCancelled()
下面是两个简单的AsyncTask 的例子:
1.这是一个模拟进度条的主要代码:
<strong style="color: rgb(255, 0, 0);"> </strong>class MyAsyncTask extends AsyncTask<Void,Integer,Void>{ @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if(isCancelled()){ return; } progressBar.setProgress(values[0]); } @Override protected Void doInBackground(Void... params) { //模拟进度更新 for (int i = 0; i <100; i++) { if(isCancelled()){ break; } publishProgress(i); try { Thread.sleep(300);//增加睡眠时间 } catch (InterruptedException e) { e.printStackTrace(); } } return null; } }
2.这是模拟从网络上加载图片的主要代码:
class MySyncTask extends AsyncTask<String,Void,Bitmap>{ @Override protected Bitmap doInBackground(String... params) { String url=params[0]; InputStream is; Bitmap bm=null; HttpURLConnection conn; try { conn= (HttpURLConnection) new URL(url).openConnection(); is=conn.getInputStream(); BufferedInputStream bis=new BufferedInputStream(is);//为什么要用包装流 bm= BitmapFactory.decodeStream(bis); is.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } return bm; } @Override protected void onPreExecute() { super.onPreExecute(); pb.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); im.setImageBitmap(bitmap); pb.setVisibility(View.GONE); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } }
然后只要在主线程中创建实例,调用execute()方法即可。
- android异步加载图片
- android 异步加载图片
- android异步加载图片
- android异步加载图片
- Android 异步加载图片
- Android 异步加载图片
- Android图片异步加载
- Android图片异步加载
- Android图片异步加载
- Android异步加载图片
- android异步加载图片
- Android图片异步加载
- Android 图片异步加载
- android异步加载图片
- 异步图片加载 Android
- Android 图片异步加载
- Android 图片异步加载
- Android 异步加载图片
- Wireshark 文件分割和合并
- 后台为php的apns证书
- Android深入浅出系列之广播机制—2-Android中的广播机制
- Unity3D 优化之路(一):DrawCall
- Android ADB命令
- Android 异步加载图片
- Mac下如何重置MySQL Root密码
- 设计模式—代理模式
- 读java编程思想有感一
- Android调用WCF服务
- 用螺旋理论分析Sarrus机构的自由度及其性质
- Android Studio 部分快捷键用法
- Erlang 学习(四) 整数和字符串相互转换
- Centos环境下Mysql5.6的安装