簡體   English   中英

android-如何在與主線程不同的線程中運行服務?

[英]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();

該線程僅在不同的線程中啟動服務,但服務在主線程中運行。 請有人幫我如何在單獨的線程中運行服務?

應用程序組件(服務、活動等)總是在主線程中運行,無論它們是從哪個線程啟動的。 考慮在您的 Service 中啟動線程,或者使用IntentService

在您的特定情況下,您可能會嘗試為傳感器更改注冊一個全局BroadcastReceiver ,這反過來將啟動IntentService以將新獲取的值放入 db 等中。

實際上, 這里是解決類似問題的鏈接

同樣,這並不是真正的多線程問題。 整個任務必須以另一種方式執行。

您在那里所做的只是啟動新活動,因此如果您運行監視器的邏輯在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 類的子類。 但是,存在一些關鍵差異。

現在,您可以通過以下方式充分利用IntentServicesIntentServices 不在主線程上運行 相反,它們運行在單獨的“工作線程”上。 這個單一屬性將解決您的問題並消除您目前面臨的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM