2016-01-10 119 views
0

我在Android上的線程沒有正確運行。 我開始從一個服務,但爲什麼它沒有正確運行。Android線程未在後臺運行

服務:

ServiceHelper sh = new ServiceHelper(); 
new Thread(sh).start(); 

public class ServiceHelper implements Runnable { 
    public void run() { 
     while(true) { 
      Log.d(LOG_TAG, "run"); 
      //1.) sometimes it calls this here: SSLSocket.close(); 
      //2.) also, sometimes it calls a write operation on this SSLSocket. 
      // but since write can block, I've put this write operation inside an AsyncTask: new WriteAsyncTask().execute(somethingToWrite); 
      // This returns immediately. 
      Thread.sleep(1000); 
     } 
    } 
} 

,這導致logcat的是這樣的:

01-10 22:39:54.148 I/TEST(10327): run 
01-10 22:40:04.150 I/TEST(10327): run 

因此,有像10秒錯過這個線程。 爲什麼會發生這種情況? 當然還有其他線程可以阻止網絡操作。 但是爲什麼這個特定的線程沒有運行?

我還注意到一個很奇怪的事情:

public void run() { 
    while(true) { 
     Log.i(LOG_TAG, "tick1"); 
     Thread.sleep(1000); 
     Log.i(LOG_TAG, "tick2"); 
    } 
} 

並不知我得到這個在日誌中:

01-11 22:06:54.649 I/BGService(10078): tick1 
01-11 22:07:50.664 I/BGService(10078): tick2 

tick1之間和tick2有一個且只有一個操作:的Thread.sleep (1000)。它幾乎可以阻塞一分鐘? 這是在一個線程,它是從一個服務啓動,但是這個巨大的延遲的主要原因是什麼?

+1

有沒有在你的代碼有什麼用線程。 – CommonsWare

+0

好的,我只是想告訴你一個非常基本的減少我的應用程序。但是,每秒鐘將消息打印到logcat中的線程看起來都是一樣的。 – Daniel

+0

因此,爲了更多瀏覽,似乎SSLSocket.close()可以阻止整個步驟。 – Daniel

回答

1

確保選中確保您運行的Runnable像這樣:

Thread t = new Thread(new ServiceHelper()); 
t.start(); 

只有這樣,它與作爲一個線程啓動。

在附註中,您正在做的是運行無限循環,這將佔用100%的CPU使用量。 Android可能會殺死或嚴重限制您的服務以允許其他服務正常運行。

+0

我糾正了這個問題,對不起。當然,原來裏面有一個睡眠。 – Daniel

+0

在這10秒內,日誌中是否發生過任何有趣的事情?很多時候,Android會在內存不足時重新啓動服務。 –

+0

不,這兩者之間沒有一條線。我知道關於Android的服務重啓事情。但我的服務記錄了它的啓動,並且不在這些線路之間顯示,所以不是這種情況。 – Daniel

-1

裏面的while循環使用這樣的事情,你會看到結果

Thread.sleep(1000);