Android开发中AsyncTask实现异步处理任务的方法
更新时间:2023-06-03 08:35:01 阅读量: 实用文档 文档下载
Android开发中AsyncTask实现异步处理任务
Android开发中AsyncTask实现异步处理任务的方法 在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
在单线程模型中始终要记住两条法则:
a.不要阻塞UI线程
b.确保只在UI线程中访问Android UI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员
Android提供了几种在其他线程中访问UI线程的方法。
◆Activity.runOnUiThread( Runnable )
◆View.post( Runnable )
◆View.postDelayed( Runnable, long )
◆Hanlder
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
◆Params 启动任务执行的输入参数,比如HTTP请求的URL。
◆Progress 后台任务执行的百分比。
◆Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
子类化AsyncTask
实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,
该
Android开发中AsyncTask实现异步处理任务
方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
Android开发中AsyncTask实现异步处理任务
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(yout.main); message= (TextView) findViewById(R.id.message); url= (EditText) findViewById(R.id.url); open= (Button) findViewById(R.id.open); open.setOnClickListener(new View.OnClickListener(){ public void onClick(View arg0){ connect();}});} private void connect(){ PageTask task= new PageTask(this); task.execute(url.getText().toString());} class PageTask extends AsyncTask<String, Integer, String>{//可变长的输入参数,与 AsyncTask.exucute()对应 ProgressDialog pdialog; public PageTask(Context context){ pdialog= new ProgressDialog(context, 0); pdialog.setButton("cancel", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int i){ dialog.cancel();}}); pdialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ public void onCancel(DialogInterface dialog){ finish();}}); pdialog.setCancelable(true); pdialog.setMax(100); pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pdialog.show();
Android开发中AsyncTask实现异步处理任务
}@Override protected String doInBackground(String... params){ try{ HttpClient client= new DefaultHttpClient();// params[0]代表连接的 url HttpGet get= new HttpGet(params[0]); HttpResponse response= client.execute(get); HttpEntity entity= response.getEntity(); long length= entity.getContentLength(); InputStream is= entity.getContent(); String s= null; if(is != null){ ByteArrayOutputStream baos= new ByteArrayOutputStream(); byte[] buf= new byte[128]; int ch= -1; int count= 0; while((ch= is.read(buf)) != -1){ baos.write(buf, 0, ch); count+= ch; if(length> 0){//如果知道响应的长度,调用 publishProgress
()更新进度 publishProgress((int) ((count/ (float) length) * 100));}//让线程休眠 100ms Thread.sleep(100);} s= new String(baos.toByteArray());}//返回结果 return s;} catch(Exception e){ e.printStackTrace();} return null;}@Override protected void onCancelled(){
Android开发中AsyncTask实现异步处理任务
super.onCancelled();}@Override protected void onPostExecute(String result){//返回 HTML页面的内容 message.setText(result); pdialog.dismiss();}@Override protected void onPreExecute(){//任务启动,可以在这里显示一个对话框,这里简单处理 message.setText(R.string.task_started);}@Override protected void onProgressUpdate(Integer... values){//更新进度 System.out.println(""+values[0]); message.setText(""+values[0]); pdialog.setProgress(values[0]);}}}






正在阅读:
Android开发中AsyncTask实现异步处理任务的方法06-03
苏州昆山市小学六年级数学课外补习班/暑假课外辅导班联系电话哪有02-06
2015年执业药师考试《药学专业知识(二)》真题及参考答案03-02
浙师大外国语09-13
流体阻力实验报告09-01
铸造技师理论考试试题03-02
掘进队各岗位危险源辨识09-09
会计信息系统复习资料05-15
什么让我陶醉作文600字07-06
区域经济学作业韦伯工业区位论的主要内容11-15
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 异步
- AsyncTask
- 任务
- Android
- 实现
- 处理
- 方法
- 开发
- 【KS5U首发】天津市和平区2012届高三第一次质量调查 历史试题 PDF版(2012和平区一模)
- CMMI培训讲义_CMMI3
- 人教版八年级上语文复习资料汇编
- D345- Standard Test Method for Sampling& Structural Applications
- Arduino教程:Arduino图形化编程软件-ArduBlock
- 经典西餐服务流程
- 餐后血糖控制的重要性
- 服务器售后服务指南
- 《企业人事管理系统》数据库设计
- 2015中国人民大学概率论与数理统计考研 招生人数 参考书 报录比 复试分数线 考研真题 考研经验 招生简章
- 浙大四版概率论与数理统计 《正态总体均值与方差的假设检验》
- 汽车电器设备原理与检修试卷1答案
- 夏莲居三十二观礼文
- 自适应信号处理课后题答案
- 有效激励与压力情绪管理(学员讲义版)(徐剑)
- 退休养老金计算办法
- MATLAB-课后习题集答案
- 文章写作之开篇 段帅 20160219 申论教研类
- 污水处理站考核制度
- 科学发展安全发展知识竞赛试题及答案