gpt4 book ai didi

java - Android、服务和线程。为什么线程不开始运行直到其他执行结束?

转载 作者:行者123 更新时间:2023-11-30 04:23:31 25 4
gpt4 key购买 nike

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,让主线程到达打印语句吗?当我尝试这个时,它总是卡在 while 循环上,我错过了什么?如果我删除 while 循环,myThread 将执行,但仅在 MyActivity 的 onCreate 方法完成后执行。有人可以向我解释为什么它们不并行运行吗?

最佳答案

服务在 UI 线程上执行。由于您没有将控制权从 onCreate 返回给框架,因此服务没有机会启动。 (调用 startService 只是请求框架启动它。)来自 docs on Services :

A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).

也许如果您声明服务在它自己的进程中启动,它就会成功启动。但随后它会修改一个与您的 Activity 看到的变量不同的 isRunning 变量。

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

关于java - Android、服务和线程。为什么线程不开始运行直到其他执行结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com