Показывать индикатор выполнения, когда загружается действие - PullRequest
20 голосов
/ 01 февраля 2011

У меня есть ListActivity, который запускает другой Activity на основе выбора списка.Эта секунда Activity должна загружать значительную часть данных из Интернета, и поэтому существует заметная задержка между моментом, когда пользователь нажимает на элемент, и отображением Activity.

Это проблемапотому что в настоящее время у меня нет возможности указать пользователю, что его щелчок обрабатывается (даже простого изменения цвета выбранного элемента списка было бы достаточно, но я не могу найти хороший способ сделать это).В идеале я мог бы отображать неопределенный ProgressDialog, пока загружается второй Activity.

Я пробовал несколько разных подходов для этого, но, похоже, ничего не работает так, как хотелось бы.


Я пробовал следующее:

  • Получение сериализуемых данных (не всех, а какой-то части) в AsyncTask в первом Activity ипередавая это в качестве дополнения ко второму.Это не очень хорошо работало, поскольку ProgressDialog, который я создал в onPreExecute(), не отображался сразу (кажется, что он задерживается из-за обработки, выполненной в doInBackground() по какой-то причине.)

Здесьэто код для этого:

AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() {
    Dialog progress;

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(SearchActivity.this, 
                "Loading data", "Please wait...");
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        DatasetReader reader = new DatasetReader();
        reader.setFundID(params[0]);
        reader.addDatsets(FundProfile.datasets);
        reader.populate();
        return reader.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        progress.dismiss();
    }
};
read.execute(selectedItem.getUniqueID());
try {
    action = new Intent(SearchActivity.this, FundProfile.class);
    action.putExtra("data", read.get());
} catch(Exception ex) {
    ex.printStackTrace();
}
  • Во втором методе действия onCreate() (это не работает вообще):

    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setProgressBarVisibility(true);

Вот метод onCreate() для второго подхода:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setTitleColor(Color.WHITE);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setProgressBarVisibility(true);

    try {
        setContentView(R.layout.fund_profile);
        // init some data
        setProgressBarVisibility(false);
    } catch(Exception ex) {
        FundProfile.this.finish();
    }
}

Ответы [ 3 ]

16 голосов
/ 01 февраля 2011

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

Похоже, вы можете начать второе действие и отобразить индикатор выполнения (или requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);), а затем запуститьASyncTask, который будет отвечать за обновление вашего интерфейса после получения данных.

3 голосов
/ 03 февраля 2011

Переместите создание намерения - и действительно все, что вам нужно сделать после завершения AsyncTask - в onPostExecute:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    progress.dismiss();
    Intent action = new Intent(SearchActivity.this, FundProfile.class);
    action.putExtra("data", result);
    // ... do more here
}

Проблема в том, что AsyncTask.get () блокирует пока задача не будет завершена.Таким образом, в приведенном выше коде поток пользовательского интерфейса блокируется, и у ProgressDialog никогда не появляется возможность появляться, пока задача не завершится.

2 голосов
/ 01 февраля 2011

Адам

Звучит так, как будто вы ищите индикатор Indeterminate Progress: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html

Вы можете отобразить это во время загрузки второго Activity, а затем установить видимость в false, как только второй Activity загрузит свои данные.

...