android 开发-AsyncTask异步任务的实现
2024-09-03 12:15:58
- AsyncTask实现的原理,和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
以下部分是学习代码:
UI:
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="750dp"
android:maxHeight="400dp"
android:adjustViewBounds="true"
/> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="68dp"
android:text="下载网络图片" /> </RelativeLayout>
Activity:
package com.example.android_asynctask_downloadimage; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream; 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 android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; /**
* @author xiaowu
* NOTE:异步任务AsyncTask
*/
public class MainActivity extends Activity {
private Button button ;
private Button button2 ;
private ImageView imageView ;
private final String IMAGE_PATH ="http://e.hiphotos.baidu.com/zhidao/pic/item/c2fdfc039245d68858f1c69fa5c27d1ed21b241d.jpg";
private ProgressDialog progressDialog ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("提示");
// progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("正在下载图片,请耐心等待..."); imageView = (ImageView) this.findViewById(R.id.imageView1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyTask().execute(IMAGE_PATH);
}
}); }
/**
* @author xiaowu
* 异步任务AsyncTask,执行网络下载图片
* AsyncTask<String, Integer, byte[]> 如果异步任务不需要参数传递,可以直接将参数设置为Void
* params:
* String:(网络图片的)路径
* Integer: 进度单位,刻度类型
* byte[]:异步任务执行的返回结果
* 异步任务有4个步骤:
* 1、onPreExecute(); 在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
* 2、doInBackground(Params...); 异步任务必须实现的方法,具体的异步任务所做的事情
* 3、onProgressUpdate(Progress...);
* 4、onPostExecute(Result);
*/
public class MyTask extends AsyncTask<String, Integer, byte[]>{
//在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//展示进度条对话框
progressDialog.show();
}
//异步任务必须实现的方法,具体的异步任务所做的事情。并将结果返回值最后一个步骤。
@Override
protected byte[] doInBackground(String... params) {
// TODO Auto-generated method stub
//
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
InputStream inputStream = null;
byte[] result = null; //图片的所有内容
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
//发起get请求,并获取反馈
HttpResponse httpResponse = httpClient.execute(httpGet);
long file_length = httpResponse.getEntity().getContentLength(); //文件实际总长度
int total_length = 0 ;
byte[] data = new byte[1024];
int len = 0 ;
if (httpResponse.getStatusLine().getStatusCode()==200) {
// result = EntityUtils.toByteArray(httpResponse.getEntity());
//读取返回内容(内容是以流的形式返回)
inputStream = httpResponse.getEntity().getContent();
//更新进度条并读取数据
while ((len = inputStream.read(data)) != -1) {
total_length +=len ;
int progress_value = (int) ((total_length/ (float) file_length)*100);
//通过publishProgress()方法发布进度值到onProgressUpdate
publishProgress(progress_value); //发布刻度单位
byteArrayOutputStream.write(data, 0, len);
}
}
result = byteArrayOutputStream.toByteArray();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关连接
httpClient.getConnectionManager().shutdown();
} return result;
}
//更新UI展示信息:如进度条的变动
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
//将doInBackground的执行结果展示到UI
@Override
protected void onPostExecute(byte[] result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
imageView.setImageBitmap(bitmap);
progressDialog.dismiss();
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
最新文章
- SQL Server 数据加密功能解析
- iOS APP可执行文件的组成
- z-index 详解
- 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载
- ps aux和ps ef的区别
- tableView尾部多处一部分空白高度
- PowerShell入门(一):PowerShell能干什么?
- jQuery的9中构造函数
- 微信小程序结合后台数据管理实现商品数据的动态展示、维护
- Java 常用List集合使用场景分析
- codeforces 842D Vitya and Strange Lesson
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165319
- MT【315】勾股数
- redis 指令文档
- Hbase学习04
- BZOJ 4282(慎二的随机数列
- 使用日志服务进行Kubernetes日志采集
- mvc返回多个结果集,返回多个视图
- NOIP2013 花匠解题报告
- Gym 100463A Crossings (树状数组 逆序对)