Поиск по этому блогу

среда, 1 мая 2013 г.

Android. Работа с потоками в графическом интерфейсе.

Ну начну с того,что до этого я никогда не писал на java под платформу android. Запуститься ничего не стоило, достаточно скачать Android SDK отсюда, распаковать, и начать программировать. Ну и первый мой "хелловорлд" сразу меня заставил лезть в гугл. Сейчас расскажу подробнее.

Итак, я очень сильно полюбил java за потоки (Threads, не путать со Stream). После скудного набора функционала серверных языков (perl, php, parser) окунуться в мир java - равносильно первый раз искупаться в море. Ты получаешь удовольствие от кодописания, обладание мощным функционалом даёт тебе чувство властелина мира )). Поэтому первым делом, я захотел сделать простенький пример для андроида используя view - компоненты. Задача не слишком сложная, тем более что на java.swing я это успел проделать несколько десятков раз.

На java код выглядел бы вот так.

// Создадим кнопку
JButton myButton = new JButton();
myButton.setText("Моя кнопка");

//Повесим обработчик
myButton.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        // Так как мы в анонимном классе,
        // то свою кнопочку мы получим таким спобобом
        JButton b = (JButton) e.getSource();
        // Выключаем, чтобы оживить её через 5 минут.
        b.setEnabled(false);
        Thread th = new Runnable(){
            @Override
            public void run(){
                try{
                    Thread.sleep(5000); // Спим 5 секунд и оживляем кнопку
                    b.
setEnabled(true);                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            };
       
    }
});

А андроиде всё немножко сложнее.  Здесь все потоки вызываются из главного потока GUI, а если ты хочешь в дочерних поуправлять элементами, то нужно воспользоваться прослоечкой, которая предоставит доступ к ресурсам. Скорее это больше похоже на асинхронный запрос из браузера к серверу. По принципу БРАУЗЕР -> СЕРВЕР -> БРАУЗЕР. Сначала идёт запрос на сервер, там что-то происходит и нам призодит ответ, который мы обрабатываем снова в браузере. Так и тут, только за объект xmlhttprequest тут выступает объект Handler.

В том месте, где мы определяем ресурсы, нужно определить объект Handler. Далее его передать в новый дочерний поток. Ну а потом естественно обработать его ответ.
// Создаём объект Handler
Handler h = new Handler() {
                          // Это его "callback", действия выполняемые при ответе
                          public void handleMessage(android.os.Message msg) {
                              if (msg.what == 1)
                                  button.setEnabled(true);
                              else
                                  System.out.println("aaas");
                          };
                        };
                   
                    Thread eThread = new Thread(new enabledButtonThread(h));
                    eThread.start();

Ну и сам код класса  enabledButtonThread

import android.os.Handler;
import android.widget.Button;

public class enabledButtonThread implements Runnable{
    private Handler _h;
   
    public enabledButtonThread(Handler h) {
        super();
        this._h = h;
    }

    @Override
    public void run() {
        try {
            // Спим 5 сек и оживляем кнопку.
            Thread.sleep(5000);
            this._h.sendEmptyMessage(1);
        } catch (InterruptedException e) {
            this._h.sendEmptyMessage(0);
            e.printStackTrace();
        }
    }
   

}
 

Комментариев нет:

Отправить комментарий

Количество·просмотров