AsyncTask--实现从网络下载一张图片的功能
2010-02-27 11:02
363 查看
1、Android 中的AsyncTask的使用心得
在android程序中一定不能阻塞UI线程,否则很容易就会弹出no respond 的对话框,导致程序退出。为了避免这种情况,一般需要较长时间执行的任务都放在线程中去执行,如从网上下载图片在界面的某个区域显示。但是使用线程回导致cpu开销过大,并且当线程管理不好时也会弹出no respond框。android提供了AsyncTask类用来处理这种情况;例如需要下载图片,然后在songImagButton中显示,下载的逻辑在songImageButton的initImage方法中。
Java代码
private class DrawImageTask extends AsyncTask<Void,Integer,Void>{
//更新图片显示区域,显示图片
@Override
protected void onPostExecute(Void params) {
// TODO Auto-generated method stub
songImageButton.invalidate();
this.cancel(false);
}
//下载图片
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
songImageButton.initImage();
return null;
}
}
一般在doInBackground中执行后台的逻辑,如下载图片或其他需要耗时长的任务,onPostExecute方法用来对界面进行操作。如果后台的逻辑有返回值,则由doInBackground返回然后传入onPostExecute方法,然后更新界面。doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
当然我个人认为AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。
2、从网络上下载一张图片
注意,需要在 manifest.xml 中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
在android程序中一定不能阻塞UI线程,否则很容易就会弹出no respond 的对话框,导致程序退出。为了避免这种情况,一般需要较长时间执行的任务都放在线程中去执行,如从网上下载图片在界面的某个区域显示。但是使用线程回导致cpu开销过大,并且当线程管理不好时也会弹出no respond框。android提供了AsyncTask类用来处理这种情况;例如需要下载图片,然后在songImagButton中显示,下载的逻辑在songImageButton的initImage方法中。
Java代码
private class DrawImageTask extends AsyncTask<Void,Integer,Void>{
//更新图片显示区域,显示图片
@Override
protected void onPostExecute(Void params) {
// TODO Auto-generated method stub
songImageButton.invalidate();
this.cancel(false);
}
//下载图片
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
songImageButton.initImage();
return null;
}
}
一般在doInBackground中执行后台的逻辑,如下载图片或其他需要耗时长的任务,onPostExecute方法用来对界面进行操作。如果后台的逻辑有返回值,则由doInBackground返回然后传入onPostExecute方法,然后更新界面。doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
当然我个人认为AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。
2、从网络上下载一张图片
package com.dream.androidresearch; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; public class AsynTaskTest extends Activity { private String imageUrl = "http://hiphotos.baidu.com/baidu/pic/item/7d8aebfebf3f9e125c6008d8.jpg"; private String param = ""; private ProgressBar pbDownload; private Button btnDownload; private ImageView ivDownload; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.asyntaks); pbDownload = (ProgressBar) this.findViewById(R.id.pb_download); btnDownload = (Button) this.findViewById(R.id.btn_download); ivDownload = (ImageView) this.findViewById(R.id.iv_download); pbDownload.setVisibility(View.GONE); btnDownload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub new myAsynTask().execute(param); } }); } Bitmap getImageFromNetwork() { URL myFileUrl = null; Bitmap bitmap = null; try { myFileUrl = new URL(imageUrl); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(bitmap==null); System.out.println(myFileUrl.toString()); return bitmap; } class myAsynTask extends AsyncTask<String, Integer, Bitmap> { @Override protected Bitmap doInBackground(String... params) { // TODO Auto-generated method stub // return null; Bitmap bitmap = getImageFromNetwork(); return bitmap; } @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub super.onPostExecute(result); if(result != null) ivDownload.setImageBitmap(result); else ivDownload.setBackgroundResource(R.drawable.icon); pbDownload.setVisibility(View.GONE); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); pbDownload.setVisibility(View.VISIBLE); pbDownload.setProgress(0); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); pbDownload.setProgress(values[0]); } } }
注意,需要在 manifest.xml 中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
相关文章推荐
- AsyncTask实现下载网络图片
- Android中AsyncTask的简单用法及实现网络图片下载的实例
- 使用ListView和AsyncTask、fastjson解析Json以及适配器BaseAdapter来实现下载网络的图片以及文字并显示出来
- Android 通过开源框架实现加载网络图片并下载到SD卡通知系统相册显示,(并实现分享图片功能)
- AsyncTask实现网络图片的异步加载
- fastdfs 新添加一个项目的图片目录 实现独立的上传下载功能
- java实现文件下载功能-----直接上图片
- Android开发本地及网络Mp3音乐播放器(十四)网络音乐下载功能实现
- Android_Volley+Image-Loader+RecyclerView实现网络下载图片瀑布流
- php+ajax实现带进度条的上传图片功能【附demo源码下载】
- Android_OkHttp+Picasso+RecyclerView实现网络图片下载瀑布流
- Java使用Http实现网络图片的下载
- 在android中使用AsyncTask从网络中下载图片,但是调用了execute方法后,最后不执行onPostExcute方法
- 第四章 网络下载之httpurlconnection 从网络上下载一张图片,在本地显示
- AsyncTask源码分析及实现网络图片的下载
- Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】
- FusionCharts 实现swf图片下载功能
- Android开发之下载服务器上的一张图片到本地java代码实现HttpURLConnection
- 实现查看网络图片功能
- Python实现简单爬虫功能--批量下载百度贴吧里的图片