Android中使用AsyncTask下载网页图片的代码清单.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在Android应用开发中,异步处理是至关重要的,特别是在处理耗时操作如网络请求和数据加载时。`AsyncTask`是Android提供的一种轻量级的异步处理机制,它允许在后台线程执行任务,然后在UI线程更新结果。在Android中,直接在主线程进行网络操作会导致应用无响应,因此,`AsyncTask`被广泛用于下载、上传等网络相关的任务。 下面是一个使用`AsyncTask`下载网页图片的详细代码清单: 我们需要导入必要的库,包括HTTP客户端Apache HttpClient以及Android的相关UI组件和工具类: ```java import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; ``` 接下来,我们创建一个`MainActivity`继承自`Activity`,在这个活动中我们将实现图片下载的功能: ```java public class MainActivity extends Activity { private static final String TAG = "test"; // 定义UI组件 Button btn_download, btn_cancel; ProgressBar progressBar; ImageView img_show; TextView tv_pro; // 定义全局变量Bitmap和AsyncTask实例 private Bitmap bitmap = null; private MyTask mTask; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化UI组件 btn_download = (Button) this.findViewById(R.id.btn_download); btn_cancel = (Button) findViewById(R.id.btn_cancel); progressBar = (ProgressBar) findViewById(R.id.pb_downdata); img_show = (ImageView) findViewById(R.id.img_show); tv_pro = (TextView) this.findViewById(R.id.tv_progress); } } ``` 在`MainActivity`中,我们有两个按钮,一个是开始下载的`btn_download`,另一个是取消下载的`btn_cancel`,还有进度条`progressBar`,图片显示控件`img_show`和进度文本`tv_pro`。 当用户点击“开始下载”按钮时,我们需要启动`AsyncTask`来下载图片: ```java public void clickExecute(View v) { mTask = new MyTask(); mTask.execute("http://a4.att.hudong.com/38/47/19300001391844134804474917734.png"); btn_download.setEnabled(false); btn_cancel.setEnabled(true); } ``` 这里,`clickExecute`方法创建了一个新的`MyTask`实例并执行`execute`方法,传入图片的URL。同时禁用“开始下载”按钮并启用“取消”按钮。 `MyTask`是我们的`AsyncTask`子类,负责实际的下载操作: ```java private class MyTask extends AsyncTask<String, Integer, Bitmap> { @Override protected Bitmap doInBackground(String... urls) { try { // 创建HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 创建HttpGet请求 HttpGet httpGet = new HttpGet(urls[0]); // 执行请求并获取响应 HttpResponse httpResponse = httpClient.execute(httpGet); // 获取HttpEntity HttpEntity httpEntity = httpResponse.getEntity(); // 读取响应内容 InputStream inputStream = httpEntity.getContent(); // 将输入流转换为Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } catch (Exception e) { Log.e(TAG, "Error in downloadImage: " + e.getMessage()); return null; } } @Override protected void onPostExecute(Bitmap result) { if (result != null && Status.FINISHED.equals(mTask.getStatus())) { // 在UI线程更新图片和进度 img_show.setImageBitmap(result); progressBar.setProgress(100); tv_pro.setText("100%"); } } @Override protected void onCancelled() { // 如果任务被取消,在这里处理 Log.d(TAG, "Task cancelled"); if (bitmap != null) { bitmap.recycle(); bitmap = null; } } @Override protected void onPreExecute() { // 在任务开始前做一些预处理,例如显示进度条 progressBar.setProgress(0); tv_pro.setText("0%"); } @Override protected void onProgressUpdate(Integer... values) { // 更新进度条 progressBar.setProgress(values[0]); tv_pro.setText(values[0] + "%"); } } ``` `doInBackground`方法在后台线程执行,它从网络获取图片并将其转换为`Bitmap`。如果发生错误,该方法会返回`null`。 `onPostExecute`方法在主线程中执行,当`doInBackground`完成后,它会更新UI,显示下载的图片和完成的进度。 `onCancelled`方法会在任务被取消时调用,我们需要在这里释放资源,防止内存泄漏。 `onPreExecute`方法在任务开始前运行,可以用来初始化UI,比如显示进度条。 `onProgressUpdate`方法在后台任务执行过程中更新UI,如更新进度条的值。 当我们点击“取消”按钮时,可以取消正在执行的任务: ```java public void clickCancel(View v) { // 取消一个正在执行的任务 if (mTask != null && !mTask.isCancelled()) { mTask.cancel(true); } // 重置按钮状态 btn_download.setEnabled(true); btn_cancel.setEnabled(false); } ``` 这个例子展示了如何使用`AsyncTask`下载网络上的图片,并在下载完成后显示到`ImageView`上,同时展示进度。在实际开发中,你可能需要根据自己的需求进行相应的调整,例如添加错误处理,优化图片加载性能,或者使用现代的网络库如Retrofit或OkHttp替代Apache HttpClient。
























- 粉丝: 51
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 《电子商务》(李沛强)第八章教学内容.pptx
- 窄带物联网(NB-IoT)行业调研与市场研究报告2023年.pdf
- 2023年面置换操作系统实验报告.doc
- 图书馆管理系统软件项目开发计划书(1).doc
- 2022华为认证笔试题.docx
- P2C电子商务模式探讨ppt课件(1).ppt
- WEB-FAST操作手册.doc
- 大连理工大学2021年9月《电子商务(管理类)》作业考核试题及答案参考12.docx
- 《网络安全与防护》课程标准(最新整理).pdf
- 电大本科计算机统考网考操作题题库小抄最新(1).doc
- 2022年地理信息系统(GIS)市场分析报告.pdf
- WEB前端开发代码使用规范标准[详].doc
- 城市轨道交通信号系统ATC.docx
- OPPM一页纸项目管理.ppt
- 东莞营销型网站建设.docx
- 浅谈广播电视中计算机技术的作用论文(1).doc



评论0