[英]android-How to run Service in different thread than main thread?
我正在嘗試在 android 中開發一個應用程序,該應用程序包含一個讀取傳感器值多個小時的服務。 當我啟動服務時,我的設備掛起,所有其他進程都變慢了。 為了解決這個問題,我嘗試在單獨的線程中啟動服務,如下所示,但問題仍然存在。
new Thread(new Runnable() {
@Override
public void run() {
Intent intent=new Intent(getApplicationContext(), SensorService.class);
startService(intent);
}
}).start();
該線程僅在不同的線程中啟動服務,但服務在主線程中運行。 請有人幫我如何在單獨的線程中運行服務?
您在那里所做的只是啟動新活動,因此如果您運行監視器的邏輯在SensorService
,那么它仍將在主線程上。 您需要將監控邏輯放入新線程中,而不僅僅是用它啟動活動。
如果您嘗試在后台線程上運行服務,您需要使用靜態performOnBackgrounThread
方法,例如可以在 Android 文檔中找到的代碼 (android-8\\SampleSyncAdapter\\src\\com\\example\\android\\samplesync\\client\\ NetworkUtilities.java):
public static Thread performOnBackgroundThread(final Runnable runnable) {
final Thread t = new Thread() {
@Override
public void run() {
try {
runnable.run();
} finally {
}
}
};
t.start();
return t;
}
同樣重要的是要記住,您永遠不想在主 UI 線程上執行網絡操作。 不是你在這里,只是一個僅供參考......
您可以使用后台服務來解決此問題。 通過對特定實例使用帶有sleep()
的Thread
將為您的問題提供解決方案
此鏈接將幫助您..
或者使用PendingIntent
會幫助你,比如......
PendingIntent operation = PendingIntent.getActivity(getBaseContext(), 0, ij, Intent.FLAG_ACTIVITY_NEW_TASK);
我認為這個問題的答案在於IntentService
的力量。 IntentService 是常規 Service 類的子類。 但是,存在一些關鍵差異。
現在,您可以通過以下方式充分利用IntentServices : IntentServices 不在主線程上運行。 相反,它們運行在單獨的“工作線程”上。 這個單一屬性將解決您的問題並消除您目前面臨的 ANR。
要了解有關服務和 IntentServices 之間差異的更多信息, 請查看此。
您可以嘗試使用AsyncTask
,請閱讀此文檔。
http://developer.android.com/reference/android/os/AsyncTask.html
要在同一個進程但另一個非主線程中啟動服務,我們可以創建另一個HandlerThread
並使用Handler
在其上運行我們的作業。
class MyService : Service() {
private lateinit var thread: HandlerThread
private lateinit var handler: Handler
override fun onCreate() {
super.onCreate()
thread = HandlerThread("MyService").apply {
start()
}
handler = Handler(thread.looper)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent?.action == "my-job") {
handler.post {
// Do any job on another non-main thread here
// ...
}
}
}
override fun onDestroy() {
thread.interrupt()
super.onDestroy()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.