android-如何在主线程不同的线程中运行Service?

pra*_*een 21 multithreading android

我正在尝试在android中开发一个应用程序,它包含一个服务来读取传感器值多个小时.当我启动服务时,我的设备会挂起,所有其他进程都会变慢.为了解决这个问题,我尝试在单独的线程中启动服务,如下所示,但问题仍然存在.

    new Thread(new Runnable() {

                @Override
                public void run() {
                    Intent intent=new Intent(getApplicationContext(), SensorService.class);
                    startService(intent);

                }
            }).start();
Run Code Online (Sandbox Code Playgroud)

此线程仅在不同的线程中启动服务,但服务在主线程中运行.Plz有人帮我如何在单独的线程中运行服务?

Eug*_*ene 7

应用程序组件(服务,活动等)始终在主线程中运行,无论它们从哪个线程开始。考虑改用服务中的启动线程,或使用IntentService

在您的特定情况下,您可以尝试BroadcastReceiver为传感器更改注册一个全局变量,这将依次启动IntentService并将新获取的值放入db等。

实际上,这里是解决类似问题的链接

同样,这实际上不是多线程问题。整个任务必须以其他方式执行。


Bla*_*rai 2

您所做的就是启动新活动,因此如果您运行监视器的逻辑位于 中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;
}
Run Code Online (Sandbox Code Playgroud)

同样重要的是要记住,您永远不想在主 UI 线程上执行网络操作。不是你这里的,仅供参考......