Дождитесь завершения встроенного потока, прежде чем переходить к следующему методу - PullRequest
4 голосов
/ 19 мая 2010

У меня есть приложение для Android, где я делаю следующее:

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 (); называется. Как я могу это сделать?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

В экземпляре Thread есть метод join, поэтому:

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 для любых изменений пользовательского интерфейса.

2 голосов
/ 19 мая 2010

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

Кроме того, если вы хотите, чтобы код выполнялся после завершения фоновой задачи, вы можете просто вызвать метод. Там нет причин ждать внутри 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 голос
/ 19 мая 2010

Другой вариант - просто переместить 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(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...