专知智库OPC研究院 | 未来经济结构核心洞察报告标题:新经济体的基石:个体工商户与“新一人公司”作为核心主力的历史必然性与系统支撑

核心内容摘要

3步实现视频内容智能解析:从原理到落地的完整指南
HG-ha/MTools从零开始:开源桌面AI工具集的环境部署与功能详解

3D Face HRN人脸重建模型在Blender/Unity中的应用实战

7 AsyncTask异步任务分类Android 基础入门教程本节引言本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask我们一般是 继承AsyncTask然后在类中实现异步操作然后将异步执行的进度反馈给UI主线程~ 好吧可能有些概念大家不懂觉得还是有必要讲解下多线程的概念那就先解释下一些概念性的东西吧

相关概念1什么是多线程答先要了解这几个名称应用程序进程线程多线程应用程序(Application)为了完成特定任务用某种语言编写的一组指令集合(一组静态代码)进程(Process):运行中的程序系统调度与资源分配的一个独立单位操作系统会为每个进程分配 一段内存空间程序的依次动态执行经理代码加载 - 执行 - 执行完毕的完整过程线程(Thread)比进程更小的执行单元每个进程可能有多条线程线程需要放在一个进程中才能执行线程是由程序负责管理的而进程则是由系统进行调度的多线程概念(Multithreading)并行地执行多条指令将CPU的时间片按照调度算法分配给各个线程实际上是分时执行的只是这个切换的时间很短用户感觉是同时而已举个简单的例子你挂着QQ突然想去听歌你需要把QQ关掉然后再去启动XX播放器吗答案是否定的我们直接打开播放器 放歌就好QQ还在运行着是吧这就是简单的多线程~在实际开发中也有这样的例子比如应用正在运行 发现新版本了想后台更新这个时候一般我们会开辟出一条后台线程用于下载新版本的apk但是这个时候 我们还可以使用应用中的其他功能这就是多线程的使用例子~2同步与异步的概念答:同步当我们执行某个功能时在没有得到结果之前这个调用就不能返回简单点就是说必须 等前一件事做完才能做下一件事举个简单的例子比如你啪啪啪为了避免弄出人命肯定要先戴好套套 然后再啪啪啪是吧~套套戴好 - 然后啪啪啪比如你没套套那啪啪啪的操作就要等待了直到你把 套套买回来带上这个时候就可以开始啪啪啪了~一个形象地例子♪(^∇^*)异步和同步则是相对的当我们执行某个功能后我们并不需要立即得到结果我们额可以正常地 做其他操作这个功能可以在完成后通知或者回调来告诉我们还是上面那个后台下载的例子后台下载 我们执行下载功能后我们就无需去关心它的下载过程当下载完毕后通知我们就可以了~

Android 为什么要引入异步任务答因为Android程序刚启动时会同时启动一个对应的主线程(Main Thread)这个主线程主要负责处理 与UI相关的事件有时我们也把他称作UI线程而在Android App时我们必须遵守这个单线程模型的规则Android UI操作并不是线程安全的并且这些操作都需要在UI线程中执行假如我们在非UI线程中比如在主线程中new Thread()另外开辟一个线程然后直接在里面修改UI控件的值 此时会抛出下述异常android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views另外还有一点如果我们把耗时的操作都放在UI线程中的话如果UI线程超过5s没有响应用于请求那么 这个时候会引发ANR(Application Not Responding)异常就是应用无响应~ 最后还有一点就是Android

0后禁止在UI线程中执行网络操作~不然会报:android.os.NetworkOnMainThreadException以上的种种原因都说明了Android引入异步任务的意义当然实现异步也不可以不用到我们本节讲解 的AsyncTask我们可以自己开辟一个线程完成相关操作后通过下述两种方法进行UI更新前面我们学的Handler我们在Handler里写好UI更新然后通过sendMessage()等的方法通知UI 更新另外别忘了Handler写在主线程和子线程中的区别哦~利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,更新UI时把Runnable 对象传进来即可~

AsyncTask全解析1为什么要用AsyncTask答:我们可以用上述两种方法来完成我们的异步操作加入要我们写的异步操作比较多或者较为繁琐 难道我们new Thread()然后用上述方法通知UI更新么程序员都是比较喜欢偷懒的既然官方给我 们提供了AsyncTask这个封装好的轻量级异步类为什么不用呢我们通过几十行的代码就可以完成 我们的异步操作而且进度可控相比起HandlerAsyncTask显得更加简单快捷~当然这只适合 简单的异步操作另外实际异步用的最多的地方就是网络操作图片加载数据传输等AsyncTask 暂时可以满足初学者的需求谢谢小应用但是到了公司真正做项目以后我们更多的使用第三发的 框架比如Volley,OkHttp,android-async-http,XUtils等很多后面进阶教程我们会选

个框架进行 学习当然你可以自己找资料学习学习但是掌握AsyncTask还是很有必要的2AsyncTask的基本结构AsyncTask是一个抽象类一般我们都会定义一个类继承AsyncTask然后重写相关方法~ 官方API:AsyncTask构建AsyncTask子类的参数相关方法与执行流程

注意事项

AsyncTask使用示例因为我们还没学到Android网络那块这里照顾下各位初学者这里用延时 线程来模拟文件下载的过程~后面讲到网络那里再给大家写几个例子~实现效果图布局文件:activity.xmlLinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android xmlns:toolshttp://schemas.android.com/tools android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical tools:context.MyActivity TextView android:idid/txttitle android:layout_widthwrap_content android:layout_heightwrap_content / !--设置一个进度条,并且设置为水平方向-- ProgressBar android:layout_widthfill_parent android:layout_heightwrap_content android:idid/pgbar style?android:attr/progressBarStyleHorizontal/ Button android:layout_widthwrap_content android:layout_heightwrap_content android:idid/btnupdate android:text更新progressBar/ /LinearLayout定义一个延时操作用于模拟下载public class DelayOperator { //延时操作,用来模拟下载 public void delay() { try { Thread.sleep(

; }catch (InterruptedException e){ e.printStackTrace();; } } }自定义AsyncTask:public class MyAsyncTask extends AsyncTaskInteger,Integer,String { private TextView txt; private ProgressBar pgbar; public MyAsyncTask(TextView txt,ProgressBar pgbar) { super(); this.txt txt; this.pgbar pgbar; } //该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法 //触发onProgressUpdate对UI进行操作 Override protected String doInBackground(Integer... params) { DelayOperator dop new DelayOperator(); int i 0; for (i 10;i 100;i

{ dop.delay(); publishProgress(i); } return i params[0].intValue() ; } //该方法运行在UI线程中,可对UI控件进行设置 Override protected void onPreExecute() { txt.setText(开始执行异步线程~); } //在doBackground方法中,每次调用publishProgress方法都会触发该方法 //运行在UI线程中,可对UI控件进行操作 Override protected void onProgressUpdate(Integer... values) { int value values[0]; pgbar.setProgress(value); } }MainActivity.javapublic class MyActivity extends ActionBarActivity { private TextView txttitle; private ProgressBar pgbar; private Button btnupdate; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txttitle (TextView)findViewById(R.id.txttitle); pgbar (ProgressBar)findViewById(R.id.pgbar); btnupdate (Button)findViewById(R.id.btnupdate); btnupdate.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { MyAsyncTask myTask new MyAsyncTask(txttitle,pgbar); myTask.execute(

; } }); } }本节小结好的本节一开始给大家普及了下应用程序进程线程多线程异步同步的概念接着又讲解 了下Android中为何要引入异步操作然后介绍了下AsyncTask的用法当然上面也说了异步操作在网络 操作用的较多后面在讲解网络操作时会用到这个AsyncTask敬请期待~本节就到这里谢谢~

91学生秘黄在线观看-91学生秘黄在线观看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123