public class MyActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Thread myThread = new Thread(){
public void run()
{
startService(new Intent(BoogerActivity.this, LocalService.class));
}
};
myThread.start();
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
while(!LocalService.isRunning);
System.out.println("Why can't you reach here!?");
}
}
-
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;
}
}
myThread不应该开始执行,将LocalService.isRunning设置为true并允许主线程到达print语句吗?当我尝试这个时它总是挂在while循环上,我错过了什么?如果我删除while循环,myThread将执行,但只有在MyActivity的onCreate方法完成后才会执行。有人可以向我解释为什么他们没有并行运行吗?
答案 0 :(得分:2)
服务在UI线程上执行。由于您没有从onCreate将控制权返回给框架,因此该服务没有机会启动。 (调用startService
只是请求框架启动它。)来自docs on Services:
服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。
也许如果您声明服务在其自己的进程中启动,它将成功启动。但是,它会修改一个与您的活动所见的isRunning
变量不同的while
变量。
顺便说一下,像你的{{1}}循环一样繁忙的等待通常是很糟糕的做法,特别是在Android设备上。
答案 1 :(得分:-1)
主线程语句while(!LocalService.isRunning);
继续执行消耗完整的CPU ..不可取的方法。
你应该做的是在while循环中休眠一段时间,然后重新检查。
while(!LocalService.isRunning);
{
System.out.println("Why can't you reach here!?");
Thread.sleep(1000);
}