zoukankan      html  css  js  c++  java
  • AsyncTask官方学习

    异步任务学习

    这两天使用到特别多的AsyncTask类,一块来学习一下吧

    AsyncTask允许更方便和简单使用UI线程,这个类允许你在UI线程中进行后台操作和展示结果,而无需操作Thread或者handlers

    AsyncTask是围绕ThreadHandler设计的辅助类,并不构成通用线程框架。AsyncTask最适合的场景是短时间操作(最好几秒钟),如果你需要保持长时间的运行,建议你使用java.util.concurrent包提供的API,比如ExecutorThreadPoolExecutorFutureTask

    一个异步任务是由三个泛型参数(Params,Progress,result)和四个步骤(onPreExecute,doInBackgroud,onProgressUpdate,onPostExecute)组成

    最简单的使用时必须重写(doInBackgroud(Params...))和最常重写(onPostExecute)方法,比如如下例子

    private class DownloadFilesTask extends AsyncTask<URL,Integer,Long>{
    	protected Long doInBackground(URL... urls){
          	int count = urls.length;
          	long totalSize = 0;
          	for(int i = 0; i< count;i++){
              	totalSize += Downloader.downloadFile(urls[i]);
              	publicProgress((i/(float)count)*100));
              	//如果cancel调用的话提前退出
              	if(isCancelled()) break;
            }
          	return totalSize;
    	}
      
      	protected void onProgressUpdate(Integer... progress){
          	setProgressPercent(progress[0]);
      	}
      	
      	protected void onPostExecute(Long result){
          	showDialog("Downloaded"+result+" bytes");
      	}
    }
    

    调用也非常简单

    new DownloadFilesTask().execute(url1,url2,url3);
    

    AsyncTask的三个泛型参数

    • Params

      代表衣服任务的执行参数,需要传到doInBackground里面的参数

    • Progress

      后台任务执行的进度单位,可以放在进度条中

    • Result

      任务执行完成返回的结果。在onPostExecute的参数就是

    三个参数不是必须要有的,也可以

    private class MyTask extends AsyncTask<Void,Void,Void>{...}
    

    AsyncTask的四个步骤

    1. onPreExecute()

      在任务执行前被UI线程调用。通常被用来进行任务的一些设置,比如在用户界面显示一个进度条

    2. doInBackground(Params...)

      在onPreExecute()结束后被后台线程调用,这个步骤被用来放置实际的任务,前面提到的Params参数被传递到这里。前面提到的result参数必须在此步骤中返回,并且传递到最后一步。这里也可以使用publicProgress(Progress...)通知执行的进度。

    3. onProgressUpdate(Progress...)

      方法在执行publishProgress(Progress...)之后被UI线程调用。这一步可以在用户界面显示任务执行的进度。例如这里通常显示一个进度条或者打印日志字段

    4. onPostExecute(Result)

      在后台任务完成之后被UI线程调用,后台的结果result参数传递到这个方法中

    取消任务

    可以通过调用cancel(boolean)方法取消任务,调用之后isCancelled()会返回True。在调用此方法之后,onPostExecute(object)将不再执行,取而代之的是onCancelled(object)。为了确保任务趋势被取消了,你应该在doInBackground(object[])始终检查isCancelled()的值。

    一些规则

    有一些规则是需要被遵守

    • AsynacTask类必须在UI线程中加载
    • 任务(task)实例必须在UI线程中被创建
    • execute()方法必须被UI线程调用
    • 不要手动调用onPreExecute()onPostExecute(result)doInBackground(Params...)onProgressUpdate(Progress...)
    • 任务只能被执行一次

    具体的参数意义请参见官方文档

  • 相关阅读:
    范围截取 字符串内容
    post请求 application/x‐www‐form‐urlencoded
    未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
    获取Url链接后的问号传值中的参数
    Post 提交跳转页面 Jquery请求
    C# POST application/x-www-form-urlencoded 请求
    《exception》第九次团队作业:Beta冲刺与验收准备(大结局)
    《Exception》第八次团队作业:Alpha冲刺
    《Exception团队》第七次作业:团队项目设计完善&编码
    《Exceptioning团队》第六次作业:团队项目系统设计改进与详细设计
  • 原文地址:https://www.cnblogs.com/kui0621/p/6193117.html
Copyright © 2011-2022 走看看