《第一行代码》学习笔记之服务

好吧我也不知道为什么自己要写这篇文章,大概这就是传说中的被逼无奈吧。
提到android的多线程编程,那么不得不提的就是服务(service)。服务是android实现程序后台运行的解决方案,其运行不依赖于用户界面,需要注意的一点是服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程,当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。这个就说到这里了。
多线程多线程,那么我们首先要说的就是线程了。线程的基本用法和java差不多,语法相同,当然,java具体是怎么弄得呢我也忘记了哈哈我废话好多啊。

class MyThread implements Runnable
{
@override
public void run()
{
//处理具体的逻辑
}
}

MyThread myThread = new MyThread();
new Thread(myThread).start();

使用的是接口,当然也可以使用继承,但那样的话耦合性会高一些,高内聚低耦合的道理就不用多说了吧。
在这里也顺便提一句android中的UI是线程不安全的,所以说想要更新应用程序里的UI元素,则必须在主线程中进行,要是在子线程中的话,就会崩溃的。
当然,你要是确实想更新的话,我们也是有方法的,这里就不得不提android的异步消息处理机制了。
上代码:


public class MainActivity extends Activity implements OnClickListener
{
public static final int UPDATE_TEXT = 1;
private TextView text;
private Button changeText;
private Handler handler = new Handler();
public void handlerMessage(Message msg)
{
switch(msg.what)
{
case UPDATE_TEXT:
//在这里可以进行UI操作
text.setText("NICE TO MEET YOU");
break;
}
}
};
...
@override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.change_text:
new Thread(new Runnable)
{
@override
public void run()
{
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);//将message对象发送出去
}
}).start();
break;
default:
break;
}
}

这里郑重提醒。以上代码请不要ctrl+c ctrl+v,因为是我直接摘抄的代码并没有运行过,出现拼写错误括号不匹配什么的错误概不负责。。
解析异步消息处理机制
1.Message
在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。比如说之前的what字段。
2.Handler
顾名思义就是处理者的意思,用于发送和处理消息即sendMessage()方法,和handleMessage()方法。
3.MessageQueue
消息队列的意思。它主要用于存放所有通过Handler发送的消息,这部分消息会一直存放在消息队列中,等待被处理。注意,每个线程只会有一个MessageQueue对象。这个很好理解的,我就不解释了。
4.Looper
Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现消息队列中存在一条消息,就将它取出,并传递好handle的handlemessage()方法中,每个线程中也只有一个Looper对象。
最后的最后,让我们再来梳理一下异步消息处理的整个流程。
首先,需要在主线程当中创建一个Handler对象,并重写handleMessage()方法。然后再子线程中需要进行UI操作时,就会创建以一个Message对象,并通过Handler将这条消息发送出去,之后这条消息会被添加到消息队列等待被处理,而Looper则会一直尝试从消息队列中取出待处理消息,最后分发会handler的handleMessage()方法中。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们就可以安心地进行UI操作了。
废话这么多,我还是直接贴图吧
这里写图片描述
一条消息经过这样一个流程之后,也就从子线程进入到了主线程,从不能更新ui编程了可以更新UI。
说了这么多,其实只是为了引出接下来的话题哈哈哈你可以忘了我上文说的东西。
AsyncTask()
这个呢,背后的实现原理等我哪天心情好的话专门开专题更新啊~
使用AsyncTask的诀窍就饿是:在doInBackfround()方法中去执行的具体耗时任务,子啊onProgress()方法中进行UI操作,在onPoseExecute()方法中执行一些任务的收尾工作。
接下来,我们开始学习一些高端的东西吧。
前台服务和普通服务,它会一直有一个正在运行的图标显示在系统的状态栏,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。不得不提的是,亲啊太服务可以一直保持运行状态,而不会由于系统内存不足的原因被回收。(我终于知道了为什么每次用浏览器下载东西的时候,那个状态栏会一直显示在那里!怎么滑动都删不掉,除非进入到下载目录中去手动停止,原来它是一个前台服务而非通知啊!再比如,用爱奇艺下载东西的时候,除非下载完成,否则那个图标也是删不掉的!强迫症真是不能接受啊)

好了,我们要开始说最最重要的东西了!前面真的是铺垫啊
服务的最佳实践-后台执行的定时任务
Android中的定时任务一般有两种实现方式,一种是使用Java
API里面提供的TIMER类,一种是使用Android的Alarm机制。
Alarm机制具有唤醒cpu的功能,可以保证每次需要执行任务的时候cpu都能正常工作。
时间紧迫,其实这篇博客主要是为了。。。说接下来的这个内容的。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值