Подтвердить что ты не робот

Как я могу показать диалог прогресса между двумя действиями?

У меня проблема. Мне нужно перейти от одного занятия к другому. У моего второго действия есть большой xml-макет с множеством элементов (я говорю о четырех сотнях aprox.), То для отображения этого второго действия требуется несколько секунд (слишком много).

Как я могу показать диалог прогресса между двумя действиями?

Я пытаюсь использовать фоновое задание для этого.

У меня есть этот метод в моей работе A:

  private void goToYear() {
   Intent intent = new Intent();
   intent.setClass (getBaseContext(), YearActivity.class);
   startActivity( intent);
  }

И в моей деятельности B:

public class YearActivity extends Activity {

 private String  TAG = "YearActivity ::";

 private ProgressDialog pd = null;


    @Override
    public void onCreate( Bundle savedInstanceState) {
        super.onCreate( savedInstanceState);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working...", "Calculating the screen...", true, false);

        // Start a new thread that will download all the data
        new MakeYearTask().execute();

    }

    private void initCalendar () {
      this.setContentView( R.layout.calendar_year);   

   ...
   ...
   initialize values
   ...
   ...

    }


    private class MakeYearTask extends AsyncTask<String, Void, Object> {
        protected Void doInBackground(String... args) {
            Log.i("YearActivity::MakeYearTask", "MakeYearTask Background thread starting");

   YearActivity.this.initCalendar();


        }

        protected void onPostExecute(Object result) {

            if (YearActivity.this.pd != null) {
             YearActivity.this.pd.dismiss();
            }
        }
   } 
}

Вы можете видеть, что я делаю setContentView вне метода onCreate.

Это не работает. Это дает мне одно исключение:

12-09 19:49:17.729: ERROR/AndroidRuntime(218): java.lang.RuntimeException: An error occured while executing doInBackground()
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.lang.Thread.run(Thread.java:1060)
12-09 19:49:17.729: ERROR/AndroidRuntime(218): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.checkThread(ViewRoot.java:2629)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.requestLayout(ViewRoot.java:545)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.View.requestLayout(View.java:7657)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1749)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1731)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2186)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2239)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.app.Activity.setContentView(Activity.java:1620)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar(YearActivity.java:42)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.access$0(YearActivity.java:41)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:120)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:1)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     ... 4 more
4b9b3361

Ответ 1

Это плохой дизайн для начала. Если у вас есть такой большой объем данных для пользователя, который предположительно будет прокручиваться, вместо этого вы должны использовать подкласс AdapterView, например ListView или GridView. XML-макет с почти 400 элементами невероятно большой.

Я понимаю, что вы пытаетесь сделать (вы пытаетесь выполнить длительное построение массивной иерархии View на отдельном Thread, используя AsyncTask, но вы обнаружили, что это взорван на вас для попытки прикоснуться к иерархии View на не-UI Thread).

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

AdapterView были созданы для решения именно такой проблемы. При значении AdapterView в памяти в любое время может существовать только экран Views. Например, у вас может быть таблица с тысячей строк, но с одновременным включением только семи строк на экран одновременно может существовать только одна строка из строки View. Кроме того, адаптер должен также перерабатывать View s, что также повышает производительность.

Ответ 2

Это может быть не лучшее решение, но то, что вы можете сделать, это расширить базовую тему, используемую в android, и установить фон окна для изображения, которое указывает, что активность загружается. Затем установите эту тему в Activity B. Теперь, когда Activity B загружается, вы увидите ваш drawable вместо черного окна. Вы даже можете получить креатив с списком анимации и получить какой-то неопределенный эффект загрузки.

Ответ 3

Вы пытались сделать new MakeYearTask().execute(); в onResume() вместо?

Пока вы не изящны, вы можете запустить задержанную запись потока в создании, чтобы подождать пару миллисов.

Изменить:

Я просто эту ошибку:

(Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views)

Вы изменяете пользовательский интерфейс из AsyncTask?

Вы должны просто создать данные в doInBackground(), но обновите ui в onPostExecute().

Ответ 4

Ваше форматирование немного не работает, но если я правильно понимаю, вы вызываете initCalendar() в AsyncTask doInBackground(). Вам не разрешено делать это с помощью AsyncTask s.

Используйте doInBackground() для длительных операций, таких как HTTP-вызовы, обращения к БД и т.д. После того, как у вас есть необходимый материал, вызовите initCalendar() из onPostExecute().