Android: как метод в классе разговаривает с UI? - PullRequest
2 голосов
/ 09 ноября 2011

там, Вот моя структура кода:

MainActivity:

public class PureDataActivity extends Activity {

    private TextView statusView, logView;
        .....
        Connection myconnection = new Connection();
        myconnection.download()//I implement this in an AsyncTask, which I didn't type here
}

Class Connection: (это другой файл)

Public class Connection{
        private void download();
        //This method download some data from server for few minutes.
}

Вопрос в том, как я могу обновлять текстовое представление в пользовательском интерфейсе каждые несколько секунд, используя некоторую информацию о скорости передачи данных? Поскольку из класса Connection я не могу получить доступ к интерфейсу пользователя.

Я знаю, что в AsyncTask я могу использовать updateProgress для доступа к пользовательскому интерфейсу, но он находится за пределами метода download (). Как получить доступ к пользовательскому интерфейсу при загрузке ()?

Спасибо.

Ответы [ 3 ]

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

Взгляните на этот Обработчик . Это поможет вам. Кроме того, пример bluetooth chat , который они предоставляют, должен дать вам представление о том, что вы должны делать.

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

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

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

public interface ConnectionCallback {
    void doYourStuff();
}

public class PureDataActivity extends Activity implements ConnectionCallback {

    private TextView statusView, logView;
        .....
        Connection myconnection = new Connection(this); // <-- this is where you pass the callback
        myconnection.download()//I implement this in an AsyncTask, which I didn't type here
    }

    @Override
    public void doYourStuff() {
       // do what you need to do on your TextView
    }
}

Public class Connection{
    private final ConnectionCallback connectionCallback;

    public Connection(final ConnectionCallback connectionCallback) {
        this.connectionCallback = connectionCallback ;
    }

    private void download() {
        //This method download some data from server for few minutes.
        // when you want to update your UI:
        connectionCallback.doYourStuff();
        //...
    }
}
0 голосов
/ 09 ноября 2011

В переопределенном методе runInBackgroundThread в AsyncTask вызовите publishProgress.Затем ваш переопределенный onProgressUpdate будет вызываться (на более позднем этапе) в вашем основном потоке, что означает, что вы можете обновить пользовательский интерфейс.

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

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