Как выполнить некоторый код в асинхронном потоке пользовательского интерфейса Android?

Я новичок в разработке Android. Я работаю над Swing и SWT уже несколько лет. Как в Swing, так и в SWT есть стратегия для выполнения кода в синхронизации и асинхронном потоке пользовательского интерфейса. Типичное использование заключается в том, что некоторые сотрудники отнимают много времени в одном потоке, а затем отображают результат в асинхронном потоке пользовательского интерфейса.

Итак, мой вопрос: есть ли аналогичная стратегия в Android? Вот мой код. Параметр runnable — это некоторый временной код. Этот метод будет отображать диалоговое окно ожидания во время выполнения, а затем ОЖИДАТЬ показ Toast после его завершения. Но Toast нужно показывать в потоке пользовательского интерфейса. Итак, как это сделать?

    public static void showWaitingDialog(final Activity parent, final Runnable runnable, String msg) {

    if (StringUtils.isEmpty(msg)) {
        msg = "processing...";
    }

    final ProgressDialog waitingDialog = ProgressDialog.show(parent, "Please Wait...", msg, true);

    // execute in a new thread instead of UI thread
    ThreadPoolUtil.execute(new Runnable() {

        public void run() {
            try {
                // some time-consume operation
                runnable.run();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                waitingDialog.dismiss();
            }
            // TODO: How to display a Toast message here? execute some code in UI Thread.

        }

    });

}

И есть ли какие-нибудь слова о системе пользовательского интерфейса Android? Например, это Thread-Safe, как потоки работают вместе и так далее. Огромное спасибо!


person DeepNightTwo    schedule 07.02.2012    source источник
comment
взгляните на AsyncTask, это наиболее поддерживаемый способ developer.android.com/reference/ android/os/AsyncTask.html   -  person Marek Sebera    schedule 07.02.2012
comment
Спасибо за вашу помощь и ссылки на ресурсы :-)   -  person DeepNightTwo    schedule 07.02.2012


Ответы (6)


Есть несколько способов сделать это,

  • Асинхронная задача

AsyncTask обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками. Example for using AsyncTask

  • Сервис

Служба — это компонент приложения, представляющий либо желание приложения выполнять более длительную операцию, не взаимодействуя с пользователем, либо предоставлять функциональные возможности для использования другими приложениями. Example for Using Service.

  • IntentService —

IntentService — это базовый класс для служб, которые обрабатывают асинхронные запросы (выраженные как намерения) по требованию. Клиенты отправляют запросы через вызовы startService(Intent); служба запускается по мере необходимости, обрабатывает каждое намерение по очереди, используя рабочий поток, и останавливается, когда заканчивается работа. Example for using IntentService.

person Lalit Poptani    schedule 07.02.2012

Вы можете использовать AsyncTask следующим образом.

Для вызова AsyncTask

new getAsynctask().execute("");

и вот класс для получения результата.

class getAsynctask extends AsyncTask<String, Long, Integer> {

    protected void onPreExecute() {
        super.onPreExecute();
        loading = ProgressDialog.show(Pass.this, null, "Please wait...");
    }
    protected Integer doInBackground(String... params) {
        try {
            // do your coding
            return null;
        } catch (Exception e) {
            return null;
        }

    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        try {
            if (loading != null && loading.isShowing())
                loading.dismiss();
        } catch (Throwable t) {
            Log.v("this is praki", "loading.dismiss() problem", t);
        }
    }
}
person prakash    schedule 07.02.2012

Всякий раз, когда вы работаете с отдельным потоком, который не является вашим потоком пользовательского интерфейса, лучше всего использовать обработчик. Всякий раз, когда вы хотите сообщить пользователю из своего потока, предположим, что есть прогресс, а затем отправьте сообщение обработчику. Внутри обработчика вы можете обработать сообщение и написать фрагмент кода, чтобы изменить что-либо в пользовательском интерфейсе. Это предпочтительный способ для Android. см. эти link1 , link2 & ссылка3

person Pawan    schedule 07.02.2012

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

initTask = new InitTask();
initTask.execute(this);


 protected class InitTask extends AsyncTask<Context, Integer, String> {     
        @Override
        protected String doInBackground(Context... params) {
            // Do the time comsuming task here 
            return "COMPLETE!";
        }

        // -- gets called just before thread begins
        @Override
        protected void onPreExecute() {         
            super.onPreExecute();

        }

        // -- called from the publish progress
        // -- notice that the datatype of the second param gets passed to this
        // method
        @Override
        protected void onProgressUpdate(Integer... values) {

        }

        // -- called if the cancel button is pressed
        @Override
        protected void onCancelled() {
            super.onCancelled();            
        }

        // -- called as soon as doInBackground method completes
        // -- notice that the third param gets passed to this method
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // Show the toast message here
        }
    }
person Farhana Haque    schedule 07.02.2012

Используйте обработчик:

static final int SHOW_TOAST = 0;
public static void showWaitingDialog(final Activity parent, final Runnable runnable, String msg) {

    if (StringUtils.isEmpty(msg)) {
        msg = "processing...";
    }

    final ProgressDialog waitingDialog = ProgressDialog.show(parent, "Please Wait...", msg, true);

    // execute in a new thread instead of UI thread
    ThreadPoolUtil.execute(new Runnable() {

        public void run() {
            try {
                // some time-consume operation
                runnable.run();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                waitingDialog.dismiss();
            }
           handler.sendMessage(handler.obtainMessage(SHOW_TOAST));

        }

    });

}

public Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SHOW_TOAST:
                //Toast here
                break;
        }
    }
};
person Prexx    schedule 07.02.2012

Статья о многопоточности из ресурсов для разработчиков Android предлагает различные варианты в зависимости от на конкретной версии SDK.

person Pau Giner    schedule 07.02.2012