学习andriod开发之 异步加载图片--- 使用系统进度条

来源:互联网 发布:淘宝网搜索排名规则 编辑:程序博客网 时间:2024/04/29 21:05

 大家好 我是akira 学习图片异步加载的例子 

说道这里有人可能要问了 什么是异步 为什么要用异步 why?

说白了很简单 省时间 省资源 我举个例子你就懂了 比如你在下东西 至于下什么

那些邪恶的骚年们又要YY了 不去管他们。比如你在下东西 这个时候 另外一个人也在下同一个东西 

那么那个人怎么办 他就等你下完 等到天荒地老?ありえないこと impossible 

他肯定也要下 那么问题就来了 他如何下?这个时候就要用到异步 

说道这里 有人可能问什么叫同步 什么叫异步 我在这里在给大家举一个简单的例子

假如你在吃饭 这个时候你觉得淡了 如果我停下来去放完盐吃 那么就是同步 如果我接着吃 旁边有个服务员给我放盐 

这个就是异步 OK 介绍了这么多 你应该知道同步和异步的概念了吧。

 一个简单的异步做法 前面说了 这次是使用加载图片的例子 那么又说道加载图片了 

问题又来了 andriod中有哪两种方式 当然答案很简单其一就是handler 其二就是我们今天要讲的AsyncTask

接着跟着文档来 看看文档怎么介绍的它


这里的东西很长 首先你应该看到这哥们是一个抽象类 那么就要用到机能 其次看到 4steps onPre doIn onPro onPost

这就够了 

接下来 看看这里的方法吧


onPreExecute()

Runs on the UI thread before doInBackground(Params...).
doInBackground(Params... params)
Override this method to perform a computation on a background thread.

onProgressUpdate(Progress... values)

Runs on the UI thread after publishProgress(Progress...) is invoked.

onPostExecute(Result result)

Runs on the UI thread after doInBackground(Params...).

这个顺序 就是执行的顺序 而pre的回调中自然是放你的进度 或者初始化一些东西 改变进度在Update中就好 

耗时当然是后台完成的 doInBack 最后完成 看到runs on uI thread after了么 这个后就是最后的回调 

一般来说 这四个是必须的 甚至来说除去update三个是必须的 

而三个参数 

String 是你传进来的链接 url Interger 注意 这里不能直接传int 就算你知道更新的只是数字也一样

而最后的那个就是你返回的结果 你可以返回一个String 也可以返回一个boolean 甚至是一个 BitMap 都可以

就是这么简单 来看看代码

咱先别着急写布局 直接代码开始

我就直接上代码了


  1. /** 
  2.  * Created by akira on 2015/1/27. 
  3.  */  
  4. public class ImageDownloadTask extends AsyncTask<String,Integer,String> {  
  5.     private Bitmap downloadImg;  
  6.     private ProgressBar mBar;  
  7.     private Context mContext;  
  8.     private int mPro = 0;  
  9.     private int MAX_PRO = 100;  
  10.     private ImageView netImageView;  
  11.   
  12.     public ImageDownloadTask(Context context, ImageView imageView, ProgressBar bar){  
  13.         this.mContext = context;  
  14.         this.netImageView = imageView;  
  15.         this.mBar = bar;  
  16.     }  
  17.   
  18.     @Override  
  19.     protected void onPreExecute() {  
  20. //        super.onPreExecute();  
  21.         mBar.setMax(MAX_PRO);  
  22.         mBar.setProgress(mPro);  
  23.         mBar.setVisibility(View.VISIBLE);  
  24.     }  
  25.   
  26.     @Override  
  27.     protected String doInBackground(String... params) {  
  28.         URL imageUrl = null;  
  29.         InputStream inputStream = null;  
  30.         try {  
  31.             imageUrl = new URL(params[0]);  
  32.         } catch (MalformedURLException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         try {  
  36.             HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();  
  37.             connection.setDoInput(true);  
  38.             connection.connect();  
  39.             inputStream =  connection.getInputStream();  
  40.             downloadImg =  BitmapFactory.decodeStream(inputStream);  
  41.   
  42.         } catch (IOException e) {  
  43.             e.printStackTrace();  
  44.         }finally {  
  45.             try {  
  46.                 inputStream.close();  
  47.             } catch (IOException e) {  
  48.                 e.printStackTrace();  
  49.             }  
  50.         }  
  51.   
  52.         return "ok";  
  53.     }  
  54.   
  55.     @Override  
  56.     protected void onProgressUpdate(Integer... values) {  
  57. //        super.onProgressUpdate(values);  
  58.         mPro = values[0];  
  59.        mBar.setProgress(mPro);  
  60.     }  
  61.   
  62.   
  63.     @Override  
  64.     protected void onPostExecute(String s) {  
  65. //        super.onPostExecute(s);  
  66.          mBar.setProgress(MAX_PRO);  
  67.          mBar.setVisibility(View.GONE);  
  68.          netImageView.setVisibility(View.VISIBLE);  
  69.          netImageView.setImageBitmap(downloadImg);  
  70.     }  
  71. }  

这里我没做什么注释 因为有些东西一看就明白 

首先 你要知道进度有最大进度和最小进度 咱先不管进度是怎么来的 因为你一传就有了

那么就产生了三个变量 mBar mPro MAX_PRO其次 因为要显示 拿什么显示 这里我就简单用一个imageVIew了 

更好的可以用自定义的view 去在canvas上画 这样的做法更灵活 这个以后再讲 然后会产生一个bitmap位图 

要知道所有的andriod系统都是位图 因此downloadImg 就产生了 

剩下的就是按部就班 传传传 然后 onPre显示 bar doinback 这里的代码也很熟悉了 

我就拿一个Url连接去做了 比较省事 其实拿imageLoader更简单 

然后 返回是否ok了 onPost就是设置你的bitmap然后bar gone掉 imageview visible你会发现先分析完过程

之后写代码就是这么简单

接下来的东西更没什么难度 

看看吧

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.     String url ;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         if(TextUtils.isEmpty(url))  
  8.             url = "http://bbra.cn/Uploadfiles/imgs/20110303/fengjin/015.jpg";  
  9.         final ProgressBar bar = (ProgressBar) findViewById(R.id.bar);  
  10.         final ImageView img = (ImageView) findViewById(R.id.img);  
  11.   
  12.         findViewById(R.id.downBtn).setOnClickListener(new View.OnClickListener() {  
  13.             @Override  
  14.             public void onClick(View view) {  
  15.                 new ImageDownloadTask(MainActivity.this,img,bar).execute(url);  
  16.             }  
  17.         });  
  18.     }  
  19.   
  20.   
  21. }  

只有一个onClick 然后执行Url  

布局代码更简单

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  tools:context=".MainActivity">  
  4.   
  5.     <TextView  
  6.         android:id="@+id/hello"  
  7.         android:text="@string/hello_world" android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content" />  
  9.   
  10.     <Button  
  11.         android:layout_below="@id/hello"  
  12.         android:id="@+id/downBtn"  
  13.         android:text="down"  
  14.         android:textSize="20sp"  
  15.         android:textColor="@android:color/black"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content" />  
  18.   
  19.     <ImageView  
  20.         android:layout_centerInParent="true"  
  21.         android:layout_below="@id/downBtn"  
  22.         android:id="@+id/img"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:scaleType="fitXY"  
  26.         android:visibility="gone"  
  27.         />  
  28.   
  29.     <ProgressBar  
  30.         android:id="@+id/bar"  
  31.         android:layout_centerInParent="true"  
  32.         android:layout_width="wrap_content"  
  33.         android:layout_height="wrap_content"  
  34.         android:visibility="gone"  
  35.         />  
  36.   
  37. </RelativeLayout>  


最后看下效果


有人说不对啊 这里怎么还有加载完毕呢 

那是我在onPost回调里面提示了一下而已 

有人说不对啊 这里我怎么一点就退呢 

那是因为这个是联网操作 检查下是否加上了权限

[html] view plaincopy
  1. <uses-permission android:name="android.permission.INTERNET" />  

有人又说 不对啊 加入我网非常卡的话 一直再转 谁知道你什么时候加载完

而且这东西太丑了 我想改怎么办 

这个就要看下一篇了 

OK 下一篇 咱们就来写一个自定义的进度条


0 0