Java Android、服务和线程。为什么';在其他执行结束之前,线程不会开始运行吗?

Java Android、服务和线程。为什么';在其他执行结束之前,线程不会开始运行吗?,java,android,multithreading,android-service,Java,Android,Multithreading,Android Service,- myThread是否应该开始执行,将LocalService.isRunning设置为true并允许主线程访问print语句?当我尝试这个时,它总是挂在while循环上,我错过了什么?如果删除while循环,myThread将执行,但仅在MyActivity的onCreate方法完成后执行。有人能解释一下为什么它们不能并行运行吗?服务在UI线程上执行。因为您没有从onCreate返回对框架的控制,所以服务没有机会启动。(调用startService仅请求框架启动它。)从: 服务在其宿主进程的

-


myThread是否应该开始执行,将LocalService.isRunning设置为true并允许主线程访问print语句?当我尝试这个时,它总是挂在while循环上,我错过了什么?如果删除while循环,myThread将执行,但仅在MyActivity的onCreate方法完成后执行。有人能解释一下为什么它们不能并行运行吗?

服务在UI线程上执行。因为您没有从onCreate返回对框架的控制,所以服务没有机会启动。(调用
startService
仅请求框架启动它。)从:

服务在其宿主进程的主线程中运行服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)

如果您声明服务在其自己的进程中启动,它可能会成功启动。但是,它将修改一个与您的活动看到的变量不同的
isRunning
变量


顺便说一句,像您的
while
循环这样的繁忙等待通常是很糟糕的做法,尤其是在Android设备上。

服务在UI线程上执行。因为您没有从onCreate返回对框架的控制,所以服务没有机会启动。(调用
startService
仅请求框架启动它。)从:

服务在其宿主进程的主线程中运行服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)

如果您声明服务在其自己的进程中启动,它可能会成功启动。但是,它将修改一个与您的活动看到的变量不同的
isRunning
变量


顺便说一句,像您的
while
循环这样的繁忙等待通常是非常糟糕的做法,尤其是在Android设备上持续执行,占用全部CPU。。不可取的方法

你应该做的是在while循环中睡眠一段时间,然后重新检查

public class LocalService extends Service
{
    public static boolean isRunning = false;
    IBinder serviceBinder;
    @Override
    public void onCreate()
    {

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        System.out.println("Service is running!");
        isRunning = true;
        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent arg0) 
    {
        // TODO Auto-generated method stub
        return null;
    }

}

(!LocalService.isRunning)时的主线程语句
持续执行,占用全部CPU。。不可取的方法

你应该做的是在while循环中睡眠一段时间,然后重新检查

public class LocalService extends Service
{
    public static boolean isRunning = false;
    IBinder serviceBinder;
    @Override
    public void onCreate()
    {

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        System.out.println("Service is running!");
        isRunning = true;
        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent arg0) 
    {
        // TODO Auto-generated method stub
        return null;
    }

}

尝试在(!LocalService.isRunning)时在
中睡眠几秒钟在(!LocalService.isRunning)时尝试在
中睡眠几秒钟onCreate
没有返回,因此服务没有机会启动。这在理论上更好,但不会解决OP的真正问题。真正的问题是,
onCreate
没有返回,因此服务没有机会启动。另外,您可以扩展IntentService,它将在后台线程上执行。啊,我不知道startService()仅仅是一个请求,这很有意义。我从你发布的文档中读到了这句话,并试图在一个单独的线程中运行,试图让它立即启动。是的,这只是我编造的一个小测试代码,所以我有点懒,我从来没有把这样忙碌的等待放在我自己学习目的之外的事情上。非常感谢。补充一下-您可以扩展IntentService,它将在后台线程上执行。啊,我不知道startService()仅仅是一个请求,这很有意义。我从你发布的文档中读到了这句话,并试图在一个单独的线程中运行,试图让它立即启动。是的,这只是我编造的一个小测试代码,所以我有点懒,我从来没有把这样忙碌的等待放在我自己学习目的之外的事情上。谢谢。
while(!LocalService.isRunning);
{
    System.out.println("Why can't you reach here!?");
    Thread.sleep(1000);
}