2

我有一個Android應用程序,它使用服務在應用程序打開時不斷更新視圖中的文本視圖。它使用它發送意圖的廣播接收器更新它。根據應用程序的性質,即使在應用程序退出/視圖消失後,服務仍需要繼續運行。顯然,在這種情況下在主線程上運行服務並不明智,因爲這樣做會太多並最終導致應用程序關閉並崩潰。那麼保持此服務運行的最佳方式是什麼?一個ASyncTask?一個單獨的線程?我會如何去做這件事?我有一個像這樣的的AsyncTask試了一下:從ASyncTask或線程運行服務?

private class MyTask extends AsyncTask { 

    @Override 
    protected Object doInBackground(Object... objects) { 
     return getActivity().getApplicationContext().startService(intent); 
    } 

    @Override 
    protected void onCancelled() { 
     getActivity().getApplicationContext().stopService(intent); 
     super.onCancelled(); 
    } 
} 

噢,我使用getActivity()getApplicationContext(),因爲這是一個片段內。

所以這工作正常;當我想要停止它時,我打電話給MyTask.execute(),MyTask.cancel(真),但是我很確定我沒有使用它,它應該如何使用。我甚至不知道我應該用什麼作爲execute方法的參數(??)。在其中開始一項服務似乎並不是最好的主意,沒有別的,當然,只用一個線程就可以更好地工作?爲了使它按照預期的方式工作,有什麼正確的方法可以解決這個問題?順便說一下,雖然這個功能比在主線程上運行時間長得多,但它在幾個小時後仍會崩潰。

+0

服務將始終運行在異步線程中。那麼上面的代碼說什麼? –

回答

1

更新:我想我想通了。我在我認爲我需要做的事情上走的很遠,顯然對於我所需要的服務,我只需要在前臺運行它(所以使用startForeground()方法)。它現在似乎在工作。抱歉!

0

你不應該在另一個線程不是事件線程啓動服務,而不是如果某些代碼需要更長的時間在服務執行,把這些代碼在只有服務類另一個線程。

要在除主應用程序以外的其他進程中執行服務,應該在清單文件中定義服務中的進程標記。

3

您可以使用異步任務在android中執行後臺任務。除非在特定情況下,否則自行處理線程是不明智的。異步任務將在後臺線程中運行,即使用戶切換到另一個視圖,也可以使用onProgress()更新定期獲得回調。這裏有一些關於異步任務的很好的教程來幫助你入門。請仔細閱讀它們,因爲異步任務將在Android開發中幫助您很多。

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

這裏是官方的文檔: https://developer.android.com/reference/android/os/AsyncTask.html

0

的背景thred不作後臺線程中運行的服務調用startService。 您應該正常調用startService,而不使用Async Task。 在您的服務中,您應該創建一個新線程來完成這項工作。在這裏你不應該使用AsyncTask,因爲這個服務可以無限期地運行,它不是一個已定義的任務。

+0

我將如何使用服務中的線程?我已經有一個處理程序和一個可用於執行流程的可運行程序;可運行程序將數據發送到更新UI的廣播接收器。我是否只是創建一個新線程並啓動處理程序並在那裏運行?因爲我嘗試過,但它導致應用程序崩潰。有沒有一種方法可以爲此創建一個線程? – NSchock

+0

沒有具體的創建線程的方法。你有什麼異常?運行服務的另一種方式是像Jeet建議的那樣將其放入單獨的過程中。 – Sameer

+0

而不是在您的服務中創建一個新的線程,只需使用IntentService。這是一個在後臺線程上創建的服務。 – Omri374