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

时间:2012-01-18 03:59:11

标签: java android multithreading android-service

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方法完成后才会执行。有人可以向我解释为什么他们没有并行运行吗?

2 个答案:

答案 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);
}