Отображение ProgressDialog во время работы потока пользовательского интерфейса в Android - PullRequest
3 голосов
/ 14 ноября 2011

Как я уже спросил по другому вопросу ЗДЕСЬ , похоже, что PackageManager.getInstalledPackages () не очень хорошо работает с Threading. Как заявили CommonsWare ЗДЕСЬ:

Возможно, PackageManager нужно вызвать в основном приложении нить, почему-то

Таким образом, наличие этого в потоке приводит к нежелательному поведению, несколько раз входя и выходя из моей Деятельности, вы получаете список отображаемых приложений, иногда с элементами, иногда пустыми. Наличие всего в потоке пользовательского интерфейса работает как сон, прекрасно загружается каждый раз. Дело в том, что пользователь ожидает какую-то обратную связь, и мне нужно ее предоставить. Когда я начинаю занятие, экран остается черным в течение 3-4-5-6 секунд (в зависимости от устройства и установленных приложений). Как я могу предоставить какую-то обратную связь? Я думаю о ProgressDialog, но я не знаю, как я могу его запустить. Спасибо.

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Как выяснилось, цикл для работы с приложениями занимает некоторое время (что можно сделать в отдельном потоке) по сравнению с вызовом PackageManager.getInstalledPackages () (который должен быть выполнен в потоке пользовательского интерфейса).*

0 голосов
/ 14 ноября 2011

Используйте Async, чтобы выполнять фоновую работу и показывать индикатор во время загрузки данных.

в вас onCreate ().звоните new AsyncCommonDataFetcher(this).execute();

public class AsyncCommonDataFetcher extends AsyncTask<Void, Void, Void> {

    Context mContext = null;
    private ProgressDialog mProgressIndicator = null;

    public AsyncCommonDataFetcher(Context ctx) {
        mContext = ctx;
    }

protected void onPreExecute() {
        mProgressIndicator = ProgressDialog.show(((Activity) mContext), null,
                    "Please wait", true);

    }
    @Override
    protected Void doInBackground(Void... voids) {
        // Do what ever work you like to do. It will do this in backgound and show user a indicator to wait.
    }

    @Override
    protected void onPostExecute(Void voidInstance) {


            try {
                if (mProgressIndicator != null) {
                    mProgressIndicator.hide();
                    mProgressIndicator.dismiss();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

    }
}
0 голосов
/ 14 ноября 2011

Попробуйте выполнить следующие действия для ProgressDialog в onCreate () вашей активности

this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
ProgressDialog LoadingDialog = ProgressDialog.show(this, "", "Loading..", true);

и затем отклоните его, когда процесс, вызывающий задержку, превысит

LoadingDialog.dismiss();
...