LINUX.ORG.RU

Проектирование класса в java

 , ,


0

3

Есть класс в андроид приложении который работает с гео данными. У класса есть два метода, getLocation & getCity. Вызываться они должны последовательно, первый метод инициирует данными объект, а второй читает эти данные и возвращает название города в котором находится девайс. Проблема в том, что данные первый метод получает с задержкой и если второй обратится за ними рано, то результат будет не тот что нужен. Собственно вопрос, как написать все это по-умному? Мне пока в голову приходит только вызов getCity с параметром getLocation, который возвращает нужные данные, но пока это как-то не работает. Тег нуб присутствует если что.

Эмм, я работал с локацией в ведерке и не понимаю в чём проблема. Если ты данные берешь с GPS, то там коллбэк для этого есть, GeoCoder, который делает реверс локации в название города работает так, что описанный тобою кейс невозможен. К слову GeoCoder дергает сеть, потому лучше пулять его в отдельный поток.

Jefail ★★★★ ()

наследуй приватный класс от OnLocationChangeListener, в котором сделай onLocationChange, который тебе коллбэком в твою активити твой город с помощью твоего метода getCity.
Т.е. не делать, например,

textView.setText(MySuperClass.getCity());

а делать
private class CityListener extends LocationListener {
@Override
        public void onLocationChanged(Location location) {
            textView.setText(getCityFromLocation(location));
        }
}



ну ты пони.

takino ★★★★ ()

Первое что приходит в голову, это паттрен Builder.

ThePretender ()
Ответ на: комментарий от takino

Спасибо за совет, кажется получилось то что надо. Но еще вопрос, если у меня onLocationChanged в другом классе и файле и я в него через конструктор предам свой объект textView что бы сделать там .setText, это нормальный способ или кривокод?

ertgblasd ★★ ()
Последнее исправление: ertgblasd (всего исправлений: 1)
Ответ на: комментарий от Jefail

К слову GeoCoder дергает сеть, потому лучше пулять его в отдельный поток.

Для этого AsyncTack кстати подойдет или лучше по-другому с потоками работать? А то встречал мнение, что для реальных задач AsyncTack лучше не использовать.

ertgblasd ★★ ()
Последнее исправление: ertgblasd (всего исправлений: 1)

по всем книгам плохо если методы нужны вызывать в определенном порядке

Может getLocation конструктором сделать?

Или засинхрониться в getCity c getLocation?

tim91 ()
Ответ на: комментарий от ertgblasd

Если ты следуешь MVC - то это кривота. По хорошему все вьюшки у тебя должны обновляться только из контроллера (т.е. SomeActivity.class)

Jefail ★★★★ ()
Ответ на: комментарий от ertgblasd

Async - это ахтунг, я бы Thread использовал, имхо.

Jefail ★★★★ ()

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

При чем тут проектирование класса, когда тебе нужна синхронизация?

loz ★★★★★ ()
Ответ на: комментарий от tim91

Может getLocation конструктором сделать?

И код из конструктора и getCity все равно будут выполняться последовательно или в чем смысл этого?

Или засинхрониться в getCity c getLocation?

Можно подробнее, что значит засинхрониться, не особо понимаю о чем речь.

ertgblasd ★★ ()
Ответ на: комментарий от ertgblasd

1) Последовательно, но последовательность конструктор - метод это нормально, в отличие от того как есть сейчас

2) Завести один общий объект на два метода и делать лок в нужный момент и отпускать когда можно работать getCity

подробнее тут: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html

tim91 ()
Ответ на: комментарий от ertgblasd

Работать будет? будет. Но будет работать плохо. Почему?
1) Утечка. Потенциально.
2) Почти гарантированно - краш, когда ты забудешь убрать референс на свою вьюху после завершения своего активити.

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

takino ★★★★ ()

Решил вернуться и немного доделать задачу. Вот так делать можно или это тоже криво и плохо?

В основной активности есть вот такой метод

    void setTitle(String title){
        final ActionBar bar = getActionBar();
        bar.setTitle(title);
    }

В класс который работает с локейшеном я передаю контекст этой активности

    LocationWorker obj = new LocationWorker(this);

И когда получены данные, в классе локейшена вызываю setTitle через объект и передаю ему название города (которое возвращает getCity)

 public void onLocationChanged(Location location) {
                loc = location;
                obj.setTitle(getCity(obj));
            }

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

ertgblasd ★★ ()
Последнее исправление: ertgblasd (всего исправлений: 1)
Ответ на: комментарий от ertgblasd

И вообще посоветуйте что почитать

Если хотите проникнуться ПП в Java - Java Concurrency Practice

По паттернам в Java - Patterns Enterprise Application Architecture

А вообще, судя по задаче, мне кажется вам стоит начать с азов проектирования. Попробуйте почитать о основах паттернов в целом. Например, ту же заезженную Design Patterns от «Банды четырех».

По теме:

Вам уже выше сказали (takino). Никаких паттернов строителя/синхронизаций/etc здесь и близко не надо.

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

takino вам дал решение. То что вы описали выше прям создано для пары событие/подписчик=) Единственное, что я бы посоветовал, это не использовать

textView.setText(getCityFromLocation(location));
непосредственно в самом подписчике, но здесь уже нужно смотреть как у вас далее построено приложение, может для вас переписывать окажется куда затратнее. Здесь уже проблема изначального проектирования тогда=(

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

Design Patterns от «Банды четырех»

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

ertgblasd ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.