Android, сервисы и потоки. Почему поток не запускается, пока не закончится другое выполнение? - PullRequest
1 голос
/ 18 января 2012
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, myThread выполнится, но только после завершения метода onCreate MyActivity. Может кто-нибудь объяснить мне, почему они не работают параллельно?

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Службы выполняются в потоке пользовательского интерфейса. Поскольку вы не возвращаете управление инфраструктуре из onCreate, у службы нет шансов на запуск. (Вызов startService просто запрашивает платформу для ее запуска.) Из документов об услугах :

Служба запускается в главном потоке своего процесса хостинга - служба не создает свой собственный поток и не запускается в отдельном процессе (если не указано иное).

Возможно, если вы объявите, что служба запускается в своем собственном процессе, она запустится успешно. Но тогда это будет изменение переменной isRunning, отличной от той, которую видит ваша деятельность.

Между прочим, занятое ожидание, такое как ваш цикл while, вообще неэффективно, особенно на устройстве Android.

0 голосов
/ 18 января 2012

оператор основного потока while(!LocalService.isRunning); продолжает выполнять загрузку всего процессора .. Не рекомендуется.

Что вам нужно сделать, это поспать некоторое время в цикле while, а затем перепроверить.

while(!LocalService.isRunning);
{
    System.out.println("Why can't you reach here!?");
    Thread.sleep(1000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...