收藏 分享(赏)

01-AsyncTaskPPT课件.ppt

上传人:Facebook 文档编号:3831876 上传时间:2018-11-20 格式:PPT 页数:32 大小:1.01MB
下载 相关 举报
01-AsyncTaskPPT课件.ppt_第1页
第1页 / 共32页
01-AsyncTaskPPT课件.ppt_第2页
第2页 / 共32页
01-AsyncTaskPPT课件.ppt_第3页
第3页 / 共32页
01-AsyncTaskPPT课件.ppt_第4页
第4页 / 共32页
01-AsyncTaskPPT课件.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、1,第五讲 Android中AsyncTask的使用,AsyncTask介绍,在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。,为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。AsyncTask的定

2、义:,public abstract class AsyncTask 说明:三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的 进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用, 如果没有被使用,可以用java.lang.Void类型代替。,AsyncTask介绍,AsyncTask异步任务的执行步骤:,1.execute(Params. params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2.onPreExecute(),在execute(Params. params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记

3、。 3.doInBackground(Params. params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress. values)来更新进度信息。 4.onProgressUpdate(Progress. values),在调用publishProgress(Progress. values)时,此方法被执行,直接将进度信息更新到UI组件上。 5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到

4、此方法中,直接将结果显示到UI组件上。,在使用的时候,有几点需要格外注意:,AsyncTask介绍,1.异步任务的实例必须在UI线程中创建。 2.execute(Params. params)方法必须在UI线程中调用。 3.不要手动调用onPreExecute(),doInBackground(Params. params),onProgressUpdate(Progress. values),onPostExecute(Result result)这几个方法。 4.不能在doInBackground(Params. params)中更改UI组件的信息。 5.一个任务实例只能执行一次,如果执行

5、第二次将会抛出异常。,实例,实例1,main.xml如下:,实例1,点击按钮执行的事件: execute.setOnClickListener(new OnClickListener() public void onClick(View v) /注意3点: /1 每次需new一个实例,新建的任务只能执行一次,否则会出现异常 /2 异步任务的实例必须在UI线程中创建 /3 execute()方法必须在UI线程中调用。 mytask=new MyTask(); mytask.execute(“http:/“); execute.setEnabled(false); cancel.setEnable

6、d(true); ); cancel.setOnClickListener(new OnClickListener() public void onClick(View v) /取消一个正在执行的任务,onCancelled()方法将会被调用mytask.cancel(true););,实例1,/onPreExecute()方法用于在执行异步任务前,主线程做一些准备工作 protected void onPreExecute() super.onPreExecute(); System.out.println(“onPreExecute() called.“); tv.setText(“loa

7、ding“); ,/onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作 protected void onPostExecute(String result) super.onPostExecute(result); System.out.println(“onPostExecute()“); tv.setText(result); execute.setEnabled(true); cancel.setEnabled(false); ,实例1,/doInBackground()方法用于在执行异步任务,不可以更改主线程中UI protected String doI

8、nBackground(String. params) System.out.println(“doInBackground().“+params); tryHttpGet hg=new HttpGet(params0); HttpClient hc=new DefaultHttpClient(); HttpResponse hr=hc.execute(hg); if(hr.getStatusLine().getStatusCode()=HttpStatus.SC_OK) HttpEntity he=hr.getEntity(); InputStream in=he.getContent();

9、 long total=he.getContentLength(); ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte buffer=new byte1024; int length=0; int count=0; while(length=in.read(buffer)!=-1) baos.write(buffer, 0, length); count=count+length; /publishProgress()为AsyncTask类中的方法,常在doInBackground()中调用此方法 ,用于通知主线程,后台任

10、务 /的执行情况. 此时会触发AsyncTask中的onProgressUpdate()方法 publishProgress(int)(float)count/total)*100); Thread.sleep(500); byte data=baos.toByteArray(); String s=new String(data,“utf-8“); return s; catch(Exception e) return null; ,实例1,/onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息 protected void onProgressUpd

11、ate(Integer. progress) / TODO Auto-generated method stub super.onProgressUpdate(progress); System.out.println(“onProgressUpdate()“); bar.setProgress(progress0); tv.setText(“loading.“+progress0+“%“); ,/ onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作 protected void onCancelled() super.onCancelled(); System.ou

12、t.println(“onCancelled().“); tv.setText(“cancelled“); bar.setProgress(0); execute.setEnabled(true); cancel.setEnabled(false); ,作业1,如下图,点击按钮,使用AsyncTask异步任务实现一首mp3音乐的下载,并把下载文件的进度显示在进度条上,下载的mp3文件保存在sd卡目录下。,作业2,使用AsyncTask异步下载图片并显示在UI界面 ,即下载 http:/ 界面上显示出来,并实现下载进度更新。,使用AsyncTask异步下载图片,点击下载按钮: button.se

13、tOnClickListener(new OnClickListener() public void onClick(View v) MyAsynaTask mTask = new MyAsynaTask(imageView, progressBar, button); mTask.execute(“http:/ );,使用AsyncTask异步下载图片,自定义异步任务: public class MyAsynaTask extends AsyncTask private ImageView img; private ProgressBar bar; private Button btn; p

14、ublic MyAsynaTask( ImageView img, ProgressBar bar,Button btn) super(); this. img = img; this. bar = bar; this.btn= btn; . ,使用AsyncTask异步下载图片,自定义异步任务方法实现:protected Bitmap doInBackground(String. params) Bitmap bitmap=null; try URL url=new URL(params0); HttpURLConnection connection=(HttpURLConnection)

15、url.openConnection(); connection.connect(); int total=connection.getContentLength(); progressBar.setMax(total); InputStream inputStream=connection.getInputStream(); ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); byte buf=new byte1024; int len = 0; int processnumber=0; while( (len=in

16、putStream.read(buf)!=-1) outputStream.write(buf, 0, len); processnumber+=len; publishProgress(processnumber);/通知要更新经度条的进度值 bitmap=BitmapFactory.decodeByteArray(outputStream.toByteArray(),0, total);inputStream.close(); catch (Exception e) return bitmap; ,使用AsyncTask异步下载图片,自定义异步任务方法实现:protected void o

17、nProgressUpdate(Integer. values) bar.setProgress(values0); super.onProgressUpdate(values); ,自定义异步任务方法实现:protected void onPostExecute(Bitmap result) img.setImageBitmap(result); super.onPostExecute(result); ,AsyncTask多任务操作,AsyncTask多任务操作,main.xml,AsyncTask多任务操作,item.xml,AsyncTask多任务操作,工具类:初始化,public c

18、lass TaskUtils public static String title = “aa“,“ff“,“hh“; public static String url = “http:/ ,“http:/ ,“http:/ ;public static int progress = 0,0,0; ,AsyncTask多任务操作,自定义AsyncTask:MyTask,protected String doInBackground(String. params)方法: int position=Integer.parseInt(params0); URL url=null; HttpURLCo

19、nnection huc=null; InputStream in=null; RandomAccessFile raf=null; String path=Environment.getExternalStorageDirectory().getPath(); int length=0;,AsyncTask多任务操作,自定义AsyncTask:MyTask,try url=new URL(TaskUtils.urlposition); huc=(HttpURLConnection) url.openConnection(); huc.setAllowUserInteraction(true)

20、; length=huc.getContentLength(); int startposition=0; in=huc.getInputStream(); File file=new File(path+“/“+“sing“+position+“.mp3“); raf=new RandomAccessFile(file, “rw“); raf.seek(startposition); byte buffer=new byte1024*10; int current=startposition; int readed=0;,AsyncTask多任务操作,自定义AsyncTask:MyTask,

21、while(filshed) while(paused)Thread.sleep(500); readed=in.read(buffer); if(readed=-1)break; raf.write(buffer, 0, readed); current=current+readed; publishProgress(int)(current/(float)length)*100),position); if(current=length) break; Thread.sleep(100); in.close(); raf.close(); huc.disconnect(); catch(E

22、xception e),AsyncTask多任务操作,自定义AsyncTask:MyTask,finally filshed=false; if(in!=null) try in.close(); if(raf!=null)raf.close(); if(huc!=null)huc.disconnect(); catch (IOException e) e.printStackTrace(); return String.valueOf(position);,AsyncTask多任务操作,自定义AsyncTask:MyTask,public void pause()paused=true; p

23、ublic void continued()paused=false; ,AsyncTask多任务操作,自定义AsyncTask:MyTask,protected void onPostExecute(String result) int pos=-1; pos=Integer.parseInt(result); for(int i=0;iMainActivity.tasklist.size();i+) if(MainActivity.tasklist.get(i).get(String.valueOf(pos)!=null) filshed=false; MainActivity.taskl

24、ist.remove(i); super.onPostExecute(result); ,AsyncTask多任务操作,自定义AsyncTask:MyTask,protected void onProgressUpdate(Integer. values) pblist.get(values1).setProgress(values0); super.onProgressUpdate(values); protected void onCancelled() filshed=false; super.onCancelled(); ,AsyncTask多任务操作,MainActivity:,/保

25、存启动的多个任务public static List tasklist=new ArrayList();MyTask task=null;Map map=null; /保存添加的item控件public List startbtnlist=new ArrayList();public List stopbtnlist=new ArrayList();public List pausebtnlist=new ArrayList();public List continuebtnlist=new ArrayList();,public void onCreate(Bundle savedInsta

26、nceState) super.onCreate(savedInstanceState);MyListAdapter adapter=new MyListAdapter(this);setListAdapter(adapter); ,AsyncTask多任务操作,MyListAdapter,class MyListAdapter extends BaseAdapter implements OnClickListenerContext context;public MyListAdapter(Context context)this.context=context;,public int ge

27、tCount() return TaskUtils.title.length; public Object getItem(int position) return position; public long getItemId(int position) return position; ,AsyncTask多任务操作,MyListAdapter的getView()方法,if(convertView=null) convertView=View.inflate(this.context, R.layout.item, null); Button startbtn=(Button) conve

28、rtView.findViewById(R.id.start); Button stopbtn=(Button) convertView.findViewById(R.id.stop); Button pausebtn=(Button) convertView.findViewById(R.id.pause); Button continuebtn=(Button) convertView.findViewById(R.id.btncontinue); ProgressBar bar=(ProgressBar) convertView.findViewById(R.id.progressBar

29、); TextView tv=(TextView) convertView.findViewById(R.id.tv);startbtn.setTag(String.valueOf(position); stopbtn.setTag(String.valueOf(position); pausebtn.setTag(String.valueOf(position); continuebtn.setTag(String.valueOf(position);tv.setText(titleposition);bar.setTag(String.valueOf(position); bar.setP

30、rogress(progressposition);,AsyncTask多任务操作,MyListAdapter的getView()方法,startbtnlist.add(startbtn); stopbtnlist.add(stopbtn); pausebtnlist.add(pausebtn); continuebtnlist.add(continuebtn); MyTask.pblist.add(bar);startbtnlist.get(position).setVisibility(0); stopbtnlist.get(position).setVisibility(8); paus

31、ebtnlist.get(position).setVisibility(8); continuebtnlist.get(position).setVisibility(8); MyTask.pblist.get(position).setVisibility(8); MyTask.pblist.get(position).setProgress(0);startbtn.setOnClickListener(this); stopbtn.setOnClickListener(this); pausebtn.setOnClickListener(this); continuebtn.setOnC

32、lickListener(this);return convertView; ,AsyncTask多任务操作,MyListAdapter:item布局中按钮的onClick()方法,case R.id.start: boolean ishas=false; MyTask startTask=null; if(!ishas) startTask=new MyTask(); map=new HashMap(); map.put(String.valueOf(v.getTag(), startTask); tasklist.add(map); startTask.execute(String.val

33、ueOf(v.getTag();startbtnlist.get(Integer.parseInt(String.valueOf(v.getTag().setVisibility(8); stopbtnlist.get(Integer.parseInt(String.valueOf(v.getTag().setVisibility(0); pausebtnlist.get(Integer.parseInt(String.valueOf(v.getTag().setVisibility(0); startbtnlist.get(Integer.parseInt(String.valueOf(v.getTag().setVisibility(8); MyTask.pblist.get(Integer.parseInt(String.valueOf(v.getTag().setVisibility(0); break;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报