2014-03-12 51 views
1

在我的應用程序中,我得到了一些活動和ReceiverThread.class越來越多的線程導致我的應用程序滯後

Thread從兩個不同的活動開始。每當我切換到另一個Activity並回想以前的活動Activity它開始一個新的Thread。因此,如果我在我的應用程序上做了大約10分鐘的測試,或者該應用程序僅用了一段時間,則會有大量的線程打開,並且都會執行相同的操作。 大部分時間線程在TimedWait

這給了我錯誤的數據,並導致應用程序滯後,有時它甚至沒有響應。

是否有很好的可能性停止線程onPause()onStop()?因爲許多方法已被棄用。或者如何恢復之前啓動的Thread並阻止Activity創建新的?

這是我ReceiverThread.run()

public void run() { 
    initiateCAN(); 
    while (true) { 
     try { 
      Thread.sleep(60); 
      mHandler.post(r); 

     } catch (InterruptedException e) { 
      break; 
     } 
    } 
} 

如果事情是不明確或丟失,請隨時提問,我會編輯自己的帖子,但不要只是簡單downvote。

+2

而不是'while(true)'你可以使用一個可以控制的標誌來停止線程while(!stop)'。但你應該看看Android服務:http://developer.android.com/guide/components/services.html – TheBronx

+0

,正如我在第一個「Caution!」一節中看到的,我仍然需要使用線程,因爲服務運行在Mainthread中,所以我不能看到使用服務的好處 – Fraggles

+0

該文檔聲明(除非另有說明)。因此,您可以使用該服務創建一個線程(只要服務正在運行,就只運行一個線程),並將數據傳遞給該服務,並將其傳遞給該線程。 –

回答

1

推薦的方法是使用內置的中斷系統。您可以通過調用Thread.interrupt()來停止該線程(如果不需要多個實例,則最好在onPause()之內)。你的run方法將需要有所改變:

public void run() { 
    initiateCAN(); 
    try { 
     while (!isInterrupted()) { 
      Thread.sleep(60); 
      mHandler.post(r); 
     } 
    } catch (InterruptedException e) { 
    } 
} 

雖然這可能會奏效,但它仍然最好使用Service或另一種方式,以確保只有一個實例在同一時間(也許片段,而不是活動? )。

+0

我應該在哪裏調用'.interrupt()'? 'onPause()'或'onStop()' – Fraggles

+1

@Fraggles查看我的編輯=) – ddmps

+0

所以這對我來說很好,因爲我是一個非常糟糕的程序員,也沒有太多時間(必須完成我的學士論文) ,我希望這會盡我們的職責,直到我獲得成績; P – Fraggles

0

您可以使用Android服務,並且該服務啓動該線程。當您切換活動時,服務正在運行,並且不需要啓動新線程。

+0

如果Pescis的答案不起作用,我將不得不嘗試。但我從來沒有與服務合作過,我希望我能夠快速工作 – Fraggles

相關問題