本项目主要实践Android开发中的多线程编程
安卓线程操作Handler\异步任务\异步消息处理机制等等
当我们需要执行一些耗时操作的实收,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不将这类操作放在子线程里面去运行,就会导致主线程被阻塞住,从而影响用户对软件的正常使用 在Android开发中,我们通常不会使用继承的方式来实现线程,因为这样耦合性会有点高,更多的时候我们都会选择使用实现Runnable接口的方式来定义一个线程
class MyThread() implements Runnable {
@Override
public void run(){
//处理具体的逻辑
}
}
相应的,启动线程的方式也会有所改变
MyThread mThread = new MyThread();
new Thread(mThread).start();
和许多GUI库一样,Android的UI也是线程不安全的,也就是说,如果想要更新应用程序里面的UI元素,则必须在主线程中进行,否则就会出现异常,在子线程当中更新UI会报出异常,但是有些时候我们必须在子线程里去执行一些耗时操作,然后根据耗时任务的执行结果来更新响应的UI控件,对于这种情况,Android提供了一套异步消息的处理机制,完美解决了再子线程中进行UI操作的问题:Handler异步消息处理机制
Android张异步消息处理主要由四个部分组成:Message\Handler\MessageQueue\Looper
Message是在线程之间传递的消息,他可以在内部携带少量的信息,用于在不同线程之间交换数据,在本项目中我们使用到了Message的what字段,初次之外还可以使用arg字段来携带一些整数型数据,使用obj最短来携带一个object对象
Handler顾名思义也就是矗立着的意思,他主要是用于发送和处理消息的,发送信息一般是使用Handler的 sendMessage() 方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的 handleMessage() 方法当中
MessageQueue是消息队列的意思,亚主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列当中,等待被处理,每个线程当中只会存在有一个MessageQueue对象
Looper是每个线程中的MessageQueue的管家,调用Looper的Loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法当中,同样的每个线程中也只会存在一个Looper对象
/**
* Created by Seale on 2018.11.15
* Author:Seale
* Function: 异步下载任务
**/
public class DownLoadTask extends AsyncTask<Void,Integer,Boolean> {
private Context context;
private TextView textView;
//进行函数的构造
public DownLoadTask(Context context, TextView textView) {
this.context = context;
this.textView = textView;
}
//这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框
@Override
protected void onPreExecute() {
Toast.makeText(context,"任务进行下载",Toast.LENGTH_SHORT).show();
}
/**
* 当任务执行完毕并通过return语句进行返回时,这个方法很快会被调用,返回的数据会作为参数传递到此方法中,
* 可以利用返回的数据来进行一些UI操作,比如说提醒任务执行的结果以及关闭一些进度条对话框等
* @param aBoolean
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}
/**
* 当后台任务中调用了publishProgress(Progress...)方法后,onProgressUpdate(Progress....)方法会很快被调用
* 该方法中携带的参数就是在后台啊任务中传递过来的,在这个方法中可以对UI进行操作,
* 利用参数中的数值就可以对界面元素进行相应的更新
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
/**
*这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务,
* 任务一旦完成就可以通过return语句来讲任务的执行结果返回
* 特别注意的是这个方法是不可以进行UI操作的,如果需要更新UI元素
* publishProgress(Progress...)方法来完成
* @param voids
*/
@Override
protected Boolean doInBackground(Void... voids) {
return null;
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。