Android多线程的实现
时间:2018-03-16作者:华清远见
熟悉java的你,对多线程编程一定不会陌生吧。当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不将这类操作放在子线程里去运行,就会导致主线程阻塞,从而影响用户对软件的正常使用并使得用户体验度降低,那么就让我们从线程的基本用法开始学习吧! 说到线程,就不得不先说线程和进程的关系,这里先简单解释一下。操作系统支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。 Android提供了四种常用的操作多线程的方式:分别是: (1)Handler机制 (2)AsyncTask (3)Activity.runOnUiThread(Runnable) (4)IntentService 下面我将对这四种方式进行介绍 Handler机制(此方法最为常用,这里我将简单概述) Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。 代码如下:
AsyncTask AsyncTask: 异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个doInBackgroud 抽象方法。要掌握AsyncTask,我们就必须要一个概念,总结起来就是: 3个泛型,4个步骤。 3个泛型指的是什么呢?我们来看看AsyncTask这个抽象类的定义,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:
AsyncTask -Params:这个泛型指定的是我们传递给异步任务执行时的参数的类型 -Progress:这个泛型指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型 -Result:这个泛型指定的异步任务执行完后返回给UI线程的结果的类型 我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如:
AsyncTask 4个步骤:当我们执行一个异步任务的时候,需要按照下面的4个步骤分别执行 -onPreExecute(这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出要给ProgressDialog -doInBackground(Params...params):在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的最后一个onPostExecute方法,在这个方法里,我们可以从网络当中获取数据等一些耗时的操作 -onProgressUpdate(Progess...values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,有时候需要将执行的进度返回给我们的UI界面,例如下载一个网络图片,我们需要时刻显示其下载的进度,就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要doInBackground方法中调用一个publishProgress(Progress的方法来将我们的进度时时刻刻传递给onProgressUpdate方法来更新 Activity.runOnUiThread(Runnable) 利用runOnUiThread(Runnable)把更新UI的代码创建在Runnable中,然后在需要更新UI时,把这个Runnable对象传给runOnUiThread(Runnable)。Runnable对象就能在UI程序中被调用。如果当前线程是UI线程,那么行动被立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。 代码如下:
IntentService IntentService继承自Service,是一个经过包装的轻量级的Service,用来接收并处理通过Intent传递的异步请求。客户端通过调用startService(Intent)启动一个IntentService,利用一个work线程依次处理顺序过来的请求,处理完成后自动结束Service。 以上就是我为大家带来的安卓多线程相关知识,希望对大家以后在Android开发道路中有所帮助,更上一层楼! 相关资讯
发表评论
|