Алексей
а в текущем вашем варианте у вас текут абстракции, и появляется много проблем, из-за которых вы и начали тут обсуждение.
Глеб
а вообще @aadolgiy верно говорит, самый простой способ - открытие и закрытие инкапсулировать в репозиторий. Позвали метод репозитория, он открыл соединение, использовал, и закрыл
в моём случае - так нельзя - у меня кейс: "тяжёлый init()/или конструктор-единожды, возможно тяжёлый close()-единожды, и лёгкий doSmth() для многократного частого использования"
Loki
Здраствуйте, хранить логин и пароль в шарэд преференс хорошая идею чтобы их заново не запрашивать в след запуске аппа?
Глеб
окей, тогда как я говорил, открываете в одном методе ЖЦ, закрываете в другом, парном.
всё верно... но если (я про внутр устройство черного ящика) - все внутр. зависимости автоматом собираются дагером то для вызовов - open()/close() мне по-любому надо ручками их все обходить?
Алексей
всё верно... но если (я про внутр устройство черного ящика) - все внутр. зависимости автоматом собираются дагером то для вызовов - open()/close() мне по-любому надо ручками их все обходить?
не смешивайте предоставление зависимостей и открытие-закрытие, сами же видите, что огребаете из-за этого. Задача Даггера - создать объекты, и воткнуть куда надо, ни в коем случае не вызывать на них какие-то методы инициализации. Задача вашего черного ящика - грамотно воспользоваться всеми зависимостями, открыть когда надо и закрыть, когда надо.
Loki
тогда как лучще их хранить?
Алексей
и "обходить" нужно только прямые зависимости. То есть, зависит у вас A от B, и B от C. При этом A знает только про B, и должно его открыть, а B уже должно разбираться, что ему внутри делать с C.
Loki
такое приложуха типа соц сеть, вводить логин пароль а бэкенд вернет токен, я по этому токену делаю запросы
Алексей
потому что это быдлокод, а про "не используйте finalize" вообще есть глава отдельная в какой-то книге, Effective Java, что ли.
Loki
чтобы чтото запросит из серва нужно этот токен
Алексей
вот в том-то и дело что те аргументы в контесксте Android не очень весомы
весь SOLID кричит о том, что так делать на надо, а он актуален везде :)
Loki
аа тоесть хранить тока токен а не остальное ок спс)
Vitaliy
вот в том-то и дело что те аргументы в контесксте Android не очень весомы
Почему? Это аргументы в пользу языка. А не только андроида
Denis
Что как бы намекает
Алексей
о, отличная ссылка, спасибо) Весь ответ Глебу расписан.
Глеб
Глеб
https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/graphics/java/android/graphics/MaskFilter.java#L26 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/graphics/java/android/graphics/PathEffect.java#L26 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/core/java/com/android/internal/util/VirtualRefBasePtr.java#L43 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/graphics/java/android/graphics/RegionIterator.java#L44 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/CameraTestThread.java#L86 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/CameraTestThread.java#L86 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/graphics/java/android/graphics/Movie.java#L82 https://github.com/aosp-mirror/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/core/java/android/app/backup/FileBackupHelperBase.java#L41
Глеб
Блин!!! А какая разница!!!
Глеб
Кто-нибудь сталкивался с созданием экрана звнка как в телеге?
Глеб
Когда тебе звонят точнее
Глеб
Я вот это видел: https://artemzin.com/blog/what-about-closing-cursors-in-object-finalize/
Глеб
Вот я и пытаюсь пынять - мне важней здравый смысл, а не "моветон или немоветон" 👌
Глеб
Да, я так и делаю - в локальном каком-то месте, ну ща в моём случае - там разрыв логики между созданием/уничтожением "За-раз" не тот случай
Vitaliy
Я вот это видел: https://artemzin.com/blog/what-about-closing-cursors-in-object-finalize/
Если вы нашли что это где то используется. То либо они занют на что идут. Либо они не знают на что идут. Будете сувать всё в finalize, потом внезапно оказется что у вас или памяти нет, потому что внезапно оказался какой то мемори лик, или же всё будет непо детски тупить. Ну или же обычная магия, когда вы ожидаете одного поведения, а будет другое. Поэтому и не нужно так делать.
Anonymous
ребята, так вообще можно? ip_ задаю до запроса
Vitaliy
ребята, так вообще можно? ip_ задаю до запроса
Нет, это очень плохо. Так не нужно делать
Anonymous
Нет, это очень плохо. Так не нужно делать
что можно придумать, если пользователь должен сперва ip указать куда ему обращаться, а потом уже работать в приложении?
Vitaliy
что можно придумать, если пользователь должен сперва ip указать куда ему обращаться, а потом уже работать в приложении?
Запилить класс, куда с помоoью конструктора будете сувать ip, и потом у него будет метод - getUrl.
Александр
Привет всем. Появилась ошибка при выполнени команды Run 'app'. Обновил только что студию до 3.0.1, обновил либы ide, в проекте сделал как тут говорится https://developer.android.com/studio/write/java8-support.html . Error:Execution failed for task ':app:transformClassesWithDesugarForDebug'. > com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: Error while executing java process with main class com.google.devtools.build.android.desugar.Desugar with arguments {@E:\Android Projects\NewEasyMoney\EasyMoneyEng\app\build\intermediates\tmp\desugar_args4823026256642565608}
Denis
Особенно из-за инфы, что try-with-resources теперь на всех апи пашет
Vitaliy
Ну так вот я пытаюсь - делать это осознано, как ты говоришь "знать на что иду" и внутри finalize() - все те же правила мем-ликов и глюков что и везде - ничего специфичного.... я могу ошибаться... поправь
+ тут ты сам осознанно идёшь на возможные риски. Понятно что правила везде одни. Но что бы вызвался(попытался по крайней мере) этот метод, он уже должен быть на примете у сборщика. А если там где то потерялась ссылка которую ты не очистил, вызовется ли он?
Vitaliy
Вот вот. Это похоже на езду по дороге с куче табличек - "впереди обрыв, стопэ". Но всё равно едем. А потом удивляемся, а что дороги то нет.
Глеб
+ тут ты сам осознанно идёшь на возможные риски. Понятно что правила везде одни. Но что бы вызвался(попытался по крайней мере) этот метод, он уже должен быть на примете у сборщика. А если там где то потерялась ссылка которую ты не очистил, вызовется ли он?
так это та же самая обязаловка - только вместо module.close() - module= null если сразу не собрался - значит не так много "жрёт" и хрен с ним, а если kill-proces - так и вовсе уже терять нечего
Глеб
то есть, если внимательную "расстановку" close-ов заменить на внимательное обнуление ... учитывая что оно при любом случае нужно))
Глеб
и то - обнуление по факту - только в корне (н-р в activity на весь черный ящик), то есть рубим корень - упадет всё дерево, если всё отписано и нет других завязок
Vitaliy
так это та же самая обязаловка - только вместо module.close() - module= null если сразу не собрался - значит не так много "жрёт" и хрен с ним, а если kill-proces - так и вовсе уже терять нечего
На самом деле твоё право :) Если хочется, можно сделать. Если ты понимаешь что вроде бы ничего страшного не произойдёт, н опочему бы и нет. Несмотря на то, что везде указывается что лучше так не делать. Но я бы покарал. Есть куда более гуманные способы завершить работу объекта. module= null - если внутри объекта нет никаких внешних ссылок, то может быть и прокатит. Все вот эти принципы они упрощают разработку и уменьшают количество ошибок. А ты говоришь про внимательноую расскановку кода. Это как раз делает на оборот. Не зря это всё было придумано.
Глеб
"module= null - если внутри объекта нет никаких внешних ссылок, то может быть и прокатит.".... именно!!! я это и имею ввиду
Глеб
А не добавишь потом при расширении объекта? И не нужно будет всё менять?
ну если "пользователь" этого модуля мыслит "java-based" - то должен понимать, что зависмости, полученые в конструктор - могут "течь", так же как и "забытые подписки" ... проблем быть не должно
Глеб
Поэтому и задал вопрос - какие по-факту риски есть??? по пунктам без воды - реальные риски в контексте андроида и сейчас вижу - что, кроме как "отложенного" close() - особо то и нету и .. более того - оно соответствует java-gc-логике - "не надо ничего закрывать-очищать - обнули ссылку и забудь - всё остальное сделает gc по своему усмотрению"
Vitaliy
Ну риски все описали уже.
Глеб
ок... спасибо всем, кто подключился!
Volodymyr
Всем привет, мне нужно сделать персонализированные пуши, я понимаю как нужно подписатся на их рассылку и отправить серверу токен, а как отписатся от пушей ?
Nikita
Дратути! Кто нибудь юзал дебаг на девайсе по wifi? Нужен обычный wifi свисток на машине или что?
Volodymyr
Как сделать что бы они перестали приходить допустим когда юзер разлогинился
Volodymyr
Тупо запросом, другого способа нет ?
Volodymyr
Понял, спасибо. У меня тоже была идея если пришел пуш и не залогинен - не показывать
Anton S
Странности какие-то с запросами в сеть начались: http://cm08323.tmweb.ru/android/determinace/backend/handler.php?type=test_login&login=justName - отправляю запрос http://screenshot.ru/dd7957f191dfb7558d78ebd0ed170c82.png отправляю, подписываюсь на вот эти треды: .subscribeOn(schedulers.io()) .observeOn(schedulers.ui()) ожидаемы ответ, совпадает с ответом сервера: http://screenshot.ru/48d9d794c1853bfbc8644dca38440842.png в итоге ошибка: D/OkHttp: <— HTTP FAILED: java.lang.StringIndexOutOfBoundsException: length=0; index=0 E/ErrorHandler: Error: java.lang.StringIndexOutOfBoundsException: length=0; index=0
Volodymyr
Да, понима. Но есть риск что запрос на удаление токена может не пройти
Volodymyr
Спасибо, подумаю
Mr.Grimm
Доброго дня! Подскажите сколько будет стоить заказ на фрилансе вот такого приложения https://docs.google.com/document/d/1VBaTlbBbkkYAnIVwK1O5rnUyzY3qm-V5j0VEhUezb0U/edit
Mr.Grimm
Если кому интересно стукните в личку
Andrew
Коллеги, пытаюсь создать БД на SD карте. Если отлаживаться через провод, то все ОК, если устанавливаю APK и запускаю приложение, то оно падает с таким исключением: https://codeshare.io/5MBBlp Подскажите, как решить проблему?
Andrew
А почему при отладке все ок?
Andrew
Адаптер: https://codeshare.io/5RWWNV
Andrew
onCreate: https://codeshare.io/2p8834
RusEm
Всем привет)
Andrew
public void onCreate(SQLiteDatabase db) { // date text yyyy-MM-dd HH:mm:ss String sql = String .format("CREATE TABLE %s (_key INTEGER PRIMARY KEY, ProductId TEXT, ProductName TEXT, Price DOUBLE, Cost DOUBLE, DateModified TEXT);", TABLE_INVENTORY); db.execSQL(sql); sql = String .format("CREATE TABLE %s (ProductId INTEGER, ProductQuantity INTEGER);", TABLE_QUANTITY); db.execSQL(sql); }
Andrew
Да, но при отладке это не вызывает exception
RusEm
По традиции - меня зовут Евгений. Я начинающий. Изучаю разработку под Android.
Andrew
А какой нужен?
Andrew
Это он создает БД
Pavlo
Всем привет. Мне нужно сделать анимацию по типу волн для плеера. Заюзал ету либу https://github.com/tangqi92/WaveLoadingView но мне нужно поменять местами цвет волн, чтоб на переднет плане волна была светлая, а на заднем темнее. Может кто делал такое, или знает как сделать?
Andrew
listViewInventory = (ListView)findViewById(R.id.listViewInventory); inventoryListViewAdapter = new InventoryListViewAdapter(this); listViewInventory.setAdapter(inventoryListViewAdapter);
Andrew
this.productList = Register.getInstance().getInventory().getAllProduct();
Andrew
здесь
Andrew
Как ее обойти, если getAllProduct() null?
Andrew
Это как?
Loki
почему при выборе медии из эмулятора (activityforresult) падает приложение а в реал девайсе нет(путь к файлу получаю чрз курсор) а если просто так получит то наоборот в реал девайсе падает
Andrew
А так: Register.getInstance().getInventory().getAllProduct()!=null?Register.getInstance().getInventory().getAllProduct():new ArrayList<ProductDescription>();
Andrew
?