2010-05-18 4 views
4

у меня есть андроид приложение, где я делаю следующее:Дождитесь инлайн нити, чтобы завершить, прежде чем перейти к следующему методу

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
     } 
    }.start(); 

    stepTwo(); 
} 

И я хотел бы, чтобы мой поток завершен до stepTwo(); называется. Как я могу это сделать?

Спасибо!

+0

может быть, вы можете использовать isAlive –

ответ

2

Экземпляр Thread имеет метод присоединиться, так:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    Thread t = new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
     } 
    }; 
    t.start(); 
    t.join(); 
    stepTwo(); 

} 

Вы можете захотеть попробовать это, хотя:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    Thread t = new Thread() { 
     public void run() { 
      //do some serious stuff... 
      SwingUtilities,invokeLater(new Runnable() { 
       public void run() { 
        dialog.dismiss();   
       } 
      }); 
      stepTwo(); 
     } 
    }; 
    t.start(); 
} 

Поскольку OnCreate в потоке пользовательского интерфейса, имея присоединиться там будет заморозить пользовательский интерфейс до завершения onCreate, сохраняя любой диалог до этого. stepTwo должен будет использовать SwingUtilities.invokeLater для внесения каких-либо изменений в пользовательский интерфейс.

+1

'dialog.dismis()' должен иметь место в UI-потоке, если я не ошибаюсь. – aioobe

+0

@aioobe - Я ожидаю, что ты прав. Для этого и предназначен SwingUtilities.invokeLater. Если андроид не отличается – sblundy

+0

Спасибо sblundy - Это работает по большей части, однако мой диалог не появляется, как я считаю. В основном происходит то, что кажется, что он правильно выполняет задачи в потоке, а затем вызывает stepTwo(); и THEN диалоговое окно появляется в течение секунды секунды и исчезает. Любые идеи, как это сделать, пока не начнется поток? – Tyler

2

Если вы хотите работать в фоновом режиме, я бы рекомендовал использовать the AsyncTask class, так как это обеспечит правильное взаимодействие с нитью пользовательского интерфейса.

Кроме того, если вы хотите, чтобы код запускался после завершения фоновой задачи, вы можете просто вызвать метод. Нет причин ждать внутри onCreate().

Ваш код будет выглядеть примерно так:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new MyAsyncTask().execute(); 
} 

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(MyActivity.this, "Please wait..", "Doing stuff..", true); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //do some serious stuff... 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     dialog.dismiss(); 
     stepTwo(); 
    } 

} 
1

Другим вариантом является просто переместить step2() в потоке, поэтому она выполняется после резьбы задач комплектных:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
      stepTwo(); 
     } 
    }.start(); 
} 
+0

Это только вариант, если 'stepTwo()' не нужно запускать в потоке пользовательского интерфейса –

Смежные вопросы