Проблемы с пользовательским интерфейсом Android - PullRequest
1 голос
/ 15 июля 2011

Я пытаюсь заставить мой пользовательский интерфейс реагировать на события (например, нажатия кнопок, завершение потоков и т. Д.) В реальном времени в Android (очевидно).

У меня есть расположение кнопок, и одна из кнопок используется для копирования неизвестного количества файлов с удаленного компьютера по FTP. FTP-часть всего этого работает очень хорошо, но я просто не могу найти способ, чтобы дать пользователю знать о ситуации:

Состояния, как я их вижу: 1) Выбрал «Загрузить файлы» из «нормального» меню. 2) Pressed Confirm (процесс загрузки может быть довольно длительным, и, возможно, я не хочу выбирать его по ошибке - однако теперь это отдельная тема, поэтому, возможно, придется переосмыслить это. 3) Скачивание 4) Загрузка завершена, восстановление нормального меню

Одна из вещей, которые, я надеялся, сработает, это запустить код FTP в отдельном потоке и, используя конструкцию thread.isAlive (), дождаться завершения потока и соответствующим образом изменить отображение.

Единственное, что я не смог сделать, это показать, что файлы загружаются. Независимо от того, что я пытаюсь сделать, дисплей переходит из представления «Подтверждение загрузки» в представление «Нормальное меню». (Обратите внимание, что это не виды, так как Android определяет их в любом случае.)

Код следует:

Btn.setOnClickListener (new View.OnClickListener()
{
    @Override
    public void onClick (View v)
    {
        hideTempWidgets();
        Btn01.setVisibility (View.GONE);                
        Btn02.setVisibility (View.GONE);                
        Btn03.setVisibility (View.GONE);                

        verfBtn.setVisibility (View.VISIBLE);
        verfBtn.setText ("Press to Verify");
        verfBtn.setOnClickListener (null);
        verfBtn.setOnClickListener (new View.OnClickListener()
        {
            @Override
            public void onClick (View v)
            {
                runOnUiThread (new Runnable()
                {
                    public void run()
                    {
                        verfBtn.setText ("Downloading...");
                    }
                });

                Thread temp = new Thread (new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            FileTransfer.getFiles (getAddr().trim());
                        }
                        catch (SQLException e)
                        { }
                    }
                }, "ftp");

                temp.start();
                while (temp.isAlive());                                 

                verfBtn.setVisibility (View.GONE);
                Btn01.setVisibility (View.VISIBLE);
                Btn02.setVisibility (View.VISIBLE);
                Btn03.setVisibility (View.VISIBLE);
                alert (true, VIBE_BLIP);
            }
        });
    }
});

Кто-нибудь сталкивался с этим и придумал достойное решение ??

Что не происходит, так это setText на «Загрузка ...», или, по крайней мере, если да, не тогда, когда я этого хочу, и слишком быстро, чтобы увидеть ... Наконец, особенно расстраивает то, что эта команда работает правильно, когда я удаляю код для запуска потока FTP.

Спасибо, Р.

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

Эта задача идеально подходит для Async Task. По сути, асинхронная задача - это поток со встроенным потокобезопасным компонентом, который позволяет публиковать обновления в пользовательском интерфейсе и уведомлять о завершении задачи. Популярная идея - показать счетчик или индикатор выполнения, пока AsyncTask не будет завершен, а затем отклонить его.

Для получения дополнительной информации об асинхронной задаче см .: http://developer.android.com/reference/android/os/AsyncTask.html

0 голосов
/ 15 июля 2011

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

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

0 голосов
/ 15 июля 2011

Я думаю, что ваша ошибка здесь:

temp.start (); while (temp.isAlive ());

Код внутри onClick () уже выполняется в графическом потоке, поэтому нет необходимости использовать метод runOnUIThread (), и вам не следует блокировать его с помощью оператора while (), который фактически блокирует поток пользовательского интерфейса до Тема завершена.

Мой совет: вместо этого вы можете запустить AsyncTask и соответствующим образом обновить пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...