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