Как я могу запустить свою функцию в потоке в Android? - PullRequest
1 голос
/ 11 октября 2011

У меня есть функция, которая динамически создает весь мой пользовательский интерфейс.

Что я могу сделать, чтобы показать ход диалога во время выполнения моей функции, а затем закрыть диалоговое окно, когда моя функция завершила работу с пользовательским интерфейсом?

Это пример моего кода:

Извините, я новичок в Android, мне сложно понять какой-то код ... Я напишу свой код здесь ...

У меня есть эта функция:

 public void principal() {
        //CODE TO CREATE ALL THE USER INTERFACE DYNAMICALLY
    }

и у меня asyncTask вот так:

public class EjecutarTarea extends AsyncTask<Void, Void, Void>
{
    protected void onPreExecute() {
        dialog = new ProgressDialog(StadioNenaActivity.this);
        dialog.setMessage("Cargando..");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }


    protected Void doInBackground(Void... unused) {


        Principal();
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... unused) {

    }

    @Override
    protected void onPostExecute(Void unused) {

        dialog.dismiss();
    }
  }

Когда я выполняю asynctask в onCreate, он вылетает:

new EjecutarTarea().execute();

Ответы [ 3 ]

1 голос
/ 11 октября 2011

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

Вот пример моей AsyncTask:

private class LoadingTask extends AsyncTask<Void, Integer, Void> {
        private ProgressBar mProg;
        private TextView mLoadingText;

        @Override protected void onPreExecute() {
            mProg = (ProgressBar)findViewById(R.id.launcherbar_loadprogress);
            mProg.setTouchDelegate(null);
            mProg.setClickable(false);
            mProg.setLongClickable(false);
            mProg.setOnTouchListener(null);
            mProg.setMax(100);

            mLoadingText = (TextView) findViewById(R.id.launcheractivity_loadingwhat);
        }

        @Override protected Void doInBackground(Void... voids) {
            try { Thread.sleep(1000); } catch (InterruptedException e) { }

            setProgressAndSleep(R.string.loading_log, 29, 250);
            LOG.setContext(LauncherActivity.this);
            LOG.setDebug(true);

            setProgressAndSleep(R.string.loading_database, 43, 250);
            AppionDatabase.setContext(LauncherActivity.this);

            setProgressAndSleep(R.string.loading_sensors, 57, 250);
            Sensor.init(LauncherActivity.this);

            setProgressAndSleep(R.string.loading_jobs, 71, 250);
            Job.init(LauncherActivity.this);

            setProgressAndSleep(R.string.loading_workbenches, 86, 250);
            WorkbenchState.init(LauncherActivity.this);

            setProgressAndSleep(R.string.loading_application_state, 100, 250);
            ApplicationState.setContext(LauncherActivity.this);
            startService(new Intent(LauncherActivity.this, BluetoothConnectionService.class));

            return null;
        }

        @Override public void onProgressUpdate(Integer... prog) {
            mLoadingText.setText(prog[0]);
            mProg.setProgress(prog[1]);
        }

        @Override public void onPostExecute(Void voids) {
            startActivity(new Intent(LauncherActivity.this, HomescreenActivity.class));
        }

        private void setProgressAndSleep(int text, int progress, int duration) {
            try {
                publishProgress(new Integer[] {text, progress});
                Thread.sleep(duration);
            } catch (InterruptedException e) {
                LOG.e(TAG, "Failed to sleep thread while loading Application Contexts!", e);
            }
        }
    }

Редактировать ПРИМЕЧАНИЕ. Я рекомендую не использовать метод setProgressAndSleep(int, int int). Я использую его только потому, что он загружается слишком быстро, и я действительно хотел загрузочную полосу. : -Р

0 голосов
/ 11 октября 2011

Ваш лучший снимок, вероятно, должен использовать ViewSwitcher , чтобы иметь временный вид с индикатором выполнения, пока вы создаете другой вид.Выполнять операции, которые занимают время в doInBackground() из AsyncTask, но фактические операции в пользовательском интерфейсе, такие как переворот вида, должны выполняться в postExecute() или через runOnUIThread().Обновления прогресса могут быть сделаны в onProgressUpdate()

0 голосов
/ 11 октября 2011

Все изменения в Android UI будут вноситься в UI Thread .Для запуска вашей функции в потоке пользовательского интерфейса вам нужно использовать mathos runOnUIThread () из действия http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

Надеюсь, это поможет вам!

...