Android带进度条的下载图片示例(AsyncTask异步任务)
在Android开发中,我们经常需要在后台进行一些耗时的操作,例如下载图片。为了避免阻塞主线程,我们可以使用AsyncTask异步任务来执行这些操作,并通过进度条来显示下载进度。下面是一个完整的示例攻略,包含两个示例说明。
示例一:使用AsyncTask下载图片并显示进度条
首先,我们需要在布局文件中添加一个进度条和一个按钮:
<ProgressBar
android:id=\"@+id/progressBar\"
android:layout_width=\"match_parent\"
android:layout_height=\"wrap_content\"
style=\"?android:attr/progressBarStyleHorizontal\"
android:max=\"100\"
android:progress=\"0\" />
<Button
android:id=\"@+id/downloadButton\"
android:layout_width=\"wrap_content\"
android:layout_height=\"wrap_content\"
android:text=\"下载图片\" />
然后,在Activity中,我们需要定义一个AsyncTask类来执行下载操作,并更新进度条:
private class DownloadTask extends AsyncTask<String, Integer, Bitmap> {
private ProgressBar progressBar;
public DownloadTask(ProgressBar progressBar) {
this.progressBar = progressBar;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setProgress(0);
}
@Override
protected Bitmap doInBackground(String... urls) {
String imageUrl = urls[0];
Bitmap bitmap = null;
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
InputStream input = new BufferedInputStream(url.openStream(), 8192);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] data = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
bitmap = BitmapFactory.decodeByteArray(output.toByteArray(), 0, output.size());
output.flush();
output.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
// 在这里更新UI,显示下载的图片
}
}
最后,在Activity的onCreate
方法中,我们可以设置按钮的点击事件来执行下载操作:
ProgressBar progressBar = findViewById(R.id.progressBar);
Button downloadButton = findViewById(R.id.downloadButton);
downloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DownloadTask downloadTask = new DownloadTask(progressBar);
downloadTask.execute(\"http://example.com/image.jpg\");
}
});
这样,当用户点击按钮时,就会执行下载操作,并通过进度条显示下载进度。
示例二:使用AsyncTask下载多张图片并显示进度条
如果我们需要下载多张图片,并显示总体的下载进度,可以稍作修改:
首先,我们需要修改AsyncTask的泛型参数,将返回值改为Bitmap[]
:
private class DownloadTask extends AsyncTask<String, Integer, Bitmap[]> {
// ...
}
然后,在doInBackground
方法中,我们需要修改代码来支持下载多张图片:
@Override
protected Bitmap[] doInBackground(String... urls) {
Bitmap[] bitmaps = new Bitmap[urls.length];
for (int i = 0; i < urls.length; i++) {
String imageUrl = urls[i];
// 下载图片的逻辑...
// 将下载的图片保存到bitmaps数组中
publishProgress((int) ((i + 1) * 100 / urls.length));
}
return bitmaps;
}
最后,在onPostExecute
方法中,我们可以遍历bitmaps
数组,将下载的图片显示出来:
@Override
protected void onPostExecute(Bitmap[] bitmaps) {
super.onPostExecute(bitmaps);
for (Bitmap bitmap : bitmaps) {
// 在这里更新UI,显示下载的图片
}
}
这样,我们就可以同时下载多张图片,并通过进度条显示总体的下载进度。
以上就是使用AsyncTask异步任务下载图片并显示进度条的完整攻略,希望对你有帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android带进度条的下载图片示例(AsyncTask异步任务) - Python技术站