Service和Thread有什么关系

也许我们很难会把这两者牵连到一起,毕竟有点八杆子打不着,但是某个xx冷不丁的问一下你,你的第一时间反应是什么?是不是也有点不知所措,毕竟我们都是撸码撸的有自信的人,对于这样的问题,总是带有一丝的不确定性,回答的也是朝着自己自信的一面去,总得说出个子丑寅卯的关系,但其实,往往会被我们的自信蒙蔽,就如今天的这个疑问,我要告诉你的是ServiceThread真的一点关系也没有!(更多Android文章请关注我的微信公众号,左边二维码)


什么是Service呢?在Android中它是四大组件之一,用户是看不到的,也就是说并不与用户产生UI交互,使用Service可以在后台执行长时间的操作;什么是ThreadThread是程序执行的最小单位,可以使用它来执行一些异步的操作。Thread可以肯定的是,它是独立运行的,也就是说在A这个Activity你启动了一个Thread,A这个Activity,finish之后,Thread如果没有停止,或者run方法没有执行完毕的话,那么这个Thread是一直执行的,由于它是独立运行的,再想办法去控制这个Thread,那是不可能的,当然了你可以杀死进程。相比较来说,在Service去执行控制这个Thread,便能解决这个问题,因为任何Activ ity都可以控制同一个Service


其实我们最大的疑惑莫过于,认为Thread也可以在后台执行,显然这是错误的,你觉得在一个Activity里new一个Thread,在run方法里执行一些定时耗时操作,应用退出进程不死的情况下,run方法里还会执行吗?显然是不会的,就比如如下的操作,应用一旦退出,只保留进程,则打印立即会停止。


private int a;

private void createThread() {
    Thread thread = new Thread() {
        @Override
        
public void run() {
            super.run();
            while 
(50) {
                1;
                
Log.i("MainActivity""===");
                try 
{
                    Thread.sleep(1000);
                
catch (InterruptedException e) {
                    e.printStackTrace();
                
}
            }
        }
    };

    
thread.start();
}


当然了我们可以结合Service解决这个问题,在Service去做上面的这些事情,那么只要进程不死,条件满足,run方法则会一直执行,以至于Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人和Thread产生混淆,其实我想说的是,Service是在主线程里运行的。


我们在ActivityonCreate方法里和Service里的onCreate分别打印这样一句话:


Log.i("ServiceId""MainActivity" + Thread.currentThread().getId() + "==" + Thread.currentThread().getName());


在看打印的log日志:


01-12 15:11:18.329 30721-30721/com.ming.abner.serviceaddthread I/ServiceId: MainActivity1==main


01-12 15:11:22.569 30721-30721/com.ming.abner.serviceaddthread I/ServiceId: MainActivity1==main


通过上面的信息,我们不难发现,线程id都是1,是一样的,并且都是在main主线程里,显而可见我们是不能在Service去执行耗时操作的,不然会出现ANR。


最后要告诉同志们的是,千万不要把后台和子线程联系到一起,他们是完全不同的概念。即便我们的应用退出,只要其进程还在,那么Service就可以继续运行,比如我们在开发当中,有一些需要时时向服务端传递状态,需要和服务器之间保持着心跳连接,那么就可以用Service来实现,为来使其不阻塞主线程,我们可以创建个子线程,来处理相关逻辑。


既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这个前边也已经说过了,Thread是独立运行的,其它Activity并不能对其操作,但是Service不同,所有的Activity都可以与Service进行关联,即便Activity销毁了,我们也可以重新来与Service建立关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值