大家好 我是akira 学习图片异步加载的例子
说道这里有人可能要问了 什么是异步 为什么要用异步 why?
说白了很简单 省时间 省资源 我举个例子你就懂了 比如你在下东西 至于下什么
那些邪恶的骚年们又要YY了 不去管他们。比如你在下东西 这个时候 另外一个人也在下同一个东西
那么那个人怎么办 他就等你下完 等到天荒地老?ありえないこと impossible
他肯定也要下 那么问题就来了 他如何下?这个时候就要用到异步
说道这里 有人可能问什么叫同步 什么叫异步 我在这里在给大家举一个简单的例子
假如你在吃饭 这个时候你觉得淡了 如果我停下来去放完盐吃 那么就是同步 如果我接着吃 旁边有个服务员给我放盐
这个就是异步 OK 介绍了这么多 你应该知道同步和异步的概念了吧。
一个简单的异步做法 前面说了 这次是使用加载图片的例子 那么又说道加载图片了
问题又来了 andriod中有哪两种方式 当然答案很简单其一就是handler 其二就是我们今天要讲的AsyncTask
接着跟着文档来 看看文档怎么介绍的它
这里的东西很长 首先你应该看到这哥们是一个抽象类 那么就要用到机能 其次看到 4steps onPre doIn onPro onPost
这就够了
接下来 看看这里的方法吧
doInBackground(Params...)
.publishProgress(Progress...)
is
invoked.Runs on the UI thread after doInBackground(Params...)
.
耗时当然是后台完成的 doInBack 最后完成 看到runs on uI thread after了么 这个后就是最后的回调
一般来说 这四个是必须的 甚至来说除去update三个是必须的
而三个参数
String 是你传进来的链接 url Interger 注意 这里不能直接传int 就算你知道更新的只是数字也一样
而最后的那个就是你返回的结果 你可以返回一个String 也可以返回一个boolean 甚至是一个 BitMap 都可以
就是这么简单 来看看代码
咱先别着急写布局 直接代码开始
我就直接上代码了
/** * Created by akira on 2015/1/27. */ public class ImageDownloadTask extends AsyncTask<String,Integer,String> { private Bitmap downloadImg; private ProgressBar mBar; private Context mContext; private int mPro = 0; private int MAX_PRO = 100; private ImageView netImageView; public ImageDownloadTask(Context context, ImageView imageView, ProgressBar bar){ this.mContext = context; this.netImageView = imageView; this.mBar = bar; } @Override protected void onPreExecute() { // super.onPreExecute(); mBar.setMax(MAX_PRO); mBar.setProgress(mPro); mBar.setVisibility(View.VISIBLE); } @Override protected String doInBackground(String... params) { URL imageUrl = null; InputStream inputStream = null; try { imageUrl = new URL(params[0]); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection(); connection.setDoInput(true); connection.connect(); inputStream = connection.getInputStream(); downloadImg = BitmapFactory.decodeStream(inputStream); } catch (IOException e) { e.printStackTrace(); }finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return "ok"; } @Override protected void onProgressUpdate(Integer... values) { // super.onProgressUpdate(values); mPro = values[0]; mBar.setProgress(mPro); } @Override protected void onPostExecute(String s) { // super.onPostExecute(s); mBar.setProgress(MAX_PRO); mBar.setVisibility(View.GONE); netImageView.setVisibility(View.VISIBLE); netImageView.setImageBitmap(downloadImg); } }
首先 你要知道进度有最大进度和最小进度 咱先不管进度是怎么来的 因为你一传就有了
那么就产生了三个变量 mBar mPro MAX_PRO其次 因为要显示 拿什么显示 这里我就简单用一个imageVIew了
更好的可以用自定义的view 去在canvas上画 这样的做法更灵活 这个以后再讲 然后会产生一个bitmap位图
要知道所有的andriod系统都是位图 因此downloadImg 就产生了
剩下的就是按部就班 传传传 然后 onPre显示 bar doinback 这里的代码也很熟悉了
我就拿一个Url连接去做了 比较省事 其实拿imageLoader更简单
然后 返回是否ok了 onPost就是设置你的bitmap然后bar gone掉 imageview visible你会发现先分析完过程
之后写代码就是这么简单
接下来的东西更没什么难度
看看吧
public class MainActivity extends Activity { String url ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(TextUtils.isEmpty(url)) url = "http://bbra.cn/Uploadfiles/imgs/20110303/fengjin/015.jpg"; final ProgressBar bar = (ProgressBar) findViewById(R.id.bar); final ImageView img = (ImageView) findViewById(R.id.img); findViewById(R.id.downBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new ImageDownloadTask(MainActivity.this,img,bar).execute(url); } }); } }
布局代码更简单
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/hello" android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_below="@id/hello" android:id="@+id/downBtn" android:text="down" android:textSize="20sp" android:textColor="@android:color/black" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:layout_centerInParent="true" android:layout_below="@id/downBtn" android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" android:visibility="gone" /> <ProgressBar android:id="@+id/bar" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" /> </RelativeLayout>
最后看下效果
有人说不对啊 这里怎么还有加载完毕呢
那是我在onPost回调里面提示了一下而已
有人说不对啊 这里我怎么一点就退呢
那是因为这个是联网操作 检查下是否加上了权限
<uses-permission android:name="android.permission.INTERNET" />
而且这东西太丑了 我想改怎么办
这个就要看下一篇了
OK 下一篇 咱们就来写一个自定义的进度条
学习andriod开发之 异步加载图片--- 使用系统进度条
原文地址:http://blog.csdn.net/mtgodd/article/details/43198435