天天看點

Service和Thread有什麼關系

也許我們很難會把這兩者牽連到一起,畢竟有點八杆子打不着,但是某個xx冷不丁的問一下你,你的第一時間反應是什麼?是不是也有點不知所措,畢竟我們都是撸碼撸的有自信的人,對于這樣的問題,總是帶有一絲的不确定性,回答的也是朝着自己自信的一面去,總得說出個子醜寅卯的關系,但其實,往往會被我們的自信蒙蔽,就如今天的這個疑問,我要告訴你的是Service與Thread真的一點關系也沒有!(更多Android文章請關注我的微信公衆号,左邊二維碼)

什麼是Service呢?在Android中它是四大元件之一,使用者是看不到的,也就是說并不與使用者産生UI互動,使用Service可以在背景執行長時間的操作;什麼是Thread?Thread是程式執行的最小機關,可以使用它來執行一些異步的操作。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 (a < 50) {

                a = a + 1;

                Log.i("MainActivity", a + "===");

                try {

                    Thread.sleep(1000);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        }

    };

    thread.start();

}

當然了我們可以結合Service解決這個問題,在Service去做上面的這些事情,那麼隻要程序不死,條件滿足,run方法則會一直執行,以至于Service我們最初了解的時候,總會覺得它是用來處理一些背景任務的,一些比較耗時的操作也可以放在這裡運作,這就會讓人和Thread産生混淆,其實我想說的是,Service是在主線程裡運作的。

我們在Activity的onCreate方法裡和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建立關聯。