Android异步下载网络图片(其二)
2013-08-04 15:18
393 查看
我们可以使用Handler、Thread/Runnable、URL、HttpURLConnection等等来进行异步下载网络图片。
但是采用这种方式有一些缺点,如下:
线程的开销较大,如果每个任务都要创建一个线程,那么程序的效率要低很多。
线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
那么有没有比较更好好的实现方式呢?这个可以有!它就是AsyncTask
AsyncTask的特点是任务在主UI线程之外运行,而回调方法是在主UI线程中,这就有效地避免了使用Handler带来的麻烦。
AsyncTask定义了三种泛型类型Params,Progress和Result。
Params启动任务执行的输入参数。
Progress后台任务执行的百分比。
Result后台执行任务返回的结果。
当然,使用它还必须覆盖它的一些抽象方法方法
onProgressUpdate(Progress...values)进度更新
注意:红色的是必须实现的。
第一步:设计好UI,与上节一样
第二步:也与上节一样。
第三步:主要是实例化AsyncTask,并执行execute(Params)
我们必须继承AsyncTask,并覆盖它的一些方法,我们这里主要是要获取网络图片,并保存为Bitmap,以便UI根据Bitmap来更新的。
那么需要为AsyncTask设置返回的类型参数为String,Integer,Bitmap类定义如下:
在
如果你返回的需要是String或者其他复杂类型时候,需要修改类的定义参数类型为你需要返回的类型,当然接受参数也是根据你的请求需要改变。
在
然后怎么用呢?在UI线程中执行吧:
MyASyncTaskyncTask=newMyASyncTask(this,frameLayout);
yncTask.execute(params);
运行结果与上节大同小异
但是采用这种方式有一些缺点,如下:
线程的开销较大,如果每个任务都要创建一个线程,那么程序的效率要低很多。
线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
那么有没有比较更好好的实现方式呢?这个可以有!它就是AsyncTask
AsyncTask的特点是任务在主UI线程之外运行,而回调方法是在主UI线程中,这就有效地避免了使用Handler带来的麻烦。
AsyncTask定义了三种泛型类型Params,Progress和Result。
Params启动任务执行的输入参数。
Progress后台任务执行的百分比。
Result后台执行任务返回的结果。
当然,使用它还必须覆盖它的一些抽象方法方法
doInBackground(Params...)执行任务
onPostExecute(Result)返回任务执行的结果,通常更新UI
onProgressUpdate(Progress...values)进度更新
注意:红色的是必须实现的。
第一步:设计好UI,与上节一样
第二步:也与上节一样。
第三步:主要是实例化AsyncTask,并执行execute(Params)
我们必须继承AsyncTask,并覆盖它的一些方法,我们这里主要是要获取网络图片,并保存为Bitmap,以便UI根据Bitmap来更新的。
那么需要为AsyncTask设置返回的类型参数为String,Integer,Bitmap类定义如下:
publicclassMyASyncTaskextendsAsyncTask<String,Integer,Bitmap>{
在
doInBackground(Params...)方法中,接受String....params,返回我们需要的Bitmap.当然我们这里是获取图片Bitmap所以要返回Bitmap
如果你返回的需要是String或者其他复杂类型时候,需要修改类的定义参数类型为你需要返回的类型,当然接受参数也是根据你的请求需要改变。
@Override
protectedBitmapdoInBackground(String...params){
Bitmapbitmap=null;
try{
URLurl=newURL(params[0]);
HttpURLConnectioncon=(HttpURLConnection)url.openConnection();
con.setDoInput(true);
con.connect();
InputStreaminputStream=con.getInputStream();
bitmap=BitmapFactory.decodeStream(inputStream);
inputStream.close();
}
catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnbitmap;
}
在
onPostExecute(Result)中是请求获得结果后更新UI部分。你会看到他的参数就是我们类中的类型参数。代码如下:
//执行获得图片数据后,更新UI:显示图片,隐藏进度条
@Override
protectedvoidonPostExecute(BitmapResult){
ImageViewimgView=(ImageView)this.viewGroup.getChildAt(0);
imgView.setImageBitmap(Result);
ProgressBarbar=(ProgressBar)this.viewGroup.getChildAt(1);
bar.setVisibility(View.GONE);
}
然后怎么用呢?在UI线程中执行吧:
MyASyncTaskyncTask=newMyASyncTask(this,frameLayout);
yncTask.execute(params);
运行结果与上节大同小异
相关文章推荐
- android异步下载网络图片(其二)
- Android异步下载网络图片(其二:AsyncTask)
- Android异步下载网络图片(其二AsyncTask)
- Android异步下载网络图片(其二)
- Android异步下载网络图片(其二)
- Android异步下载网络图片(其二)
- Android异步下载网络图片(其二:AsyncTask)
- android异步下载网络图片(其二)
- Android异步下载网络图片(其二)
- Android异步下载网络图片
- Android异步下载网络图片
- Android异步下载网络图片
- Android开发之异步获取并下载网络资源-下载图片和下载文本内容
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android异步从网络下载图片并且缓存图片到本地的demo
- android异步下载网络图片(二)
- android异步从网络下载图片,并缓存到本地
- Android异步下载网络图片(其三:ExecutorService)
- Android异步下载网络图片(其一)