• VKSdk, Android. Как создать связь между устройствами?

    @zeooon Автор вопроса
    Вот, если кому пригодится.
    <<Предлагаю обратить внимание на методы:
    vk.com/dev/storage.set и vk.com/dev/storage.get

    Сохранить информацию, доступную другим копиям приложения, они позволят, но получить оповещение об этом не удастся. Приложению придется самому опрашивать состояние ключей. >>
    Ответ написан
    Комментировать
  • Как работает класс object в этом кода?

    EugeneP2
    @EugeneP2
    Java Dev
    Object clone = x.clone();

    Это клон(копия) объекта класса Date.

    Дальше его нужно привести к типу Date
    Date cloneDate = (Date) clone;

    Почему clone() возвращает Object ? - потому как этот метод наследуется от класса Object, а так как все типы в джаве наследуют класс Object, следовательно clone() должен возвращать общий для всех типов тип - Object

    UPDATE:

    Для начала нужно разобраться, почему же все таки нужно переопределять метод clone(), а не воспользоватся наследуемой нативной реализацией данного метода. Все дело в том, что базовый метод клонирование выполняет только поверхностное копирование. Будут скопированные только значения полей класса. Для примитивных типов (int, byte, char), все будет норм, но если это массивы, коллекции, объекты (например Date), или ваши типы, то будут скопированы только ссылки на них. В итогу клонирования у нас будет два объекта, у которых поля ссылаются на одни и те же поля, и через эти поля можно повлиять на все объекты которые клонировались:

    class TestClone implements Cloneable {
        		
        		private Date date = new Date();
    
    			public Date getDate() {
    				return date;
    			}
    
    			public void setDate(Date date) {
    				this.date = date;
    			}
    
    			@Override
    			protected Object clone() throws CloneNotSupportedException {
    				return super.clone();
    			}
        	}
        	
        	TestClone a = new TestClone();
        	TestClone b = (TestClone) a.clone();
        	System.out.println(a.getDate());
        	System.out.println(b.getDate());
        	b.getDate().setYear(0);
        	System.out.println(a.getDate());
        	System.out.println(b.getDate());
    
    
    
    // Fri Jul 10 23:13:47 EEST 2015
    // Fri Jul 10 23:13:47 EEST 2015
    // изменили один, а поменялось два
    // Tue Jul 10 23:13:47 EET 1900
    // Tue Jul 10 23:13:47 EET 1900


    Такое не пройдет, если будут неизменяемые (immutable) классы, тот же String. У него нет методов для изменения состояния.

    Потому то и нужно переопределять метод clone и выполнять глубокое копирование всех изменяемых объектов на который ссылаются поля (если есть такие).

    class TestClone implements Cloneable {
        		
        		private Date date = new Date();
        		private String s = "string"; // этот не нужно клонировать
        		
    			public Date getDate() {
    				return date;
    			}
    
    			public void setDate(Date date) {
    				this.date = date;
    			}
    
    			@Override
    			protected Object clone() throws CloneNotSupportedException {
    				TestClone clone = (TestClone) super.clone();
    				if (this.date != null) {
    					clone.date = (Date) this.date.clone();
    				}
    				return clone;
    			}
        	}
    
    
    Fri Jul 10 23:25:16 EEST 2015
    Fri Jul 10 23:25:16 EEST 2015
    // теперь это действительно клоны
    Fri Jul 10 23:25:16 EEST 2015
    Tue Jul 10 23:25:16 EET 1900


    Почему JVM само не может выполнить глубокое клонирование? - Потому как JVM не в курсе насколько клонирование должно быть глубоким:) И как правильно нужно копировать поля, со всеми нюансами, которые задумал программист:)

    ИМХО: интерфейс маркер Cloneable обязателен, чтоб можно было понять, переопределен ли метод clone в класса или нет.

    TestClone с = new TestClone();
        	
        	if (с instanceof Cloneable) {
        		System.out.println("ок, меня можно клонировать");
        	}


    PS
    Есть готовое решение от google для глубокого клонирование.
    Отличная статья: Глубокое клонирование в Java без велосипедов
    Ответ написан
    8 комментариев
  • Что лучше для android?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    не говорите, что лучше на java!

    Правда глаза режет?

    jython или jruby

    Для этих двух инструментов справедлива аксиома Эскобара в контексте вопроса.

    https://github.com/damonkohler/sl4a
    Ответ написан
    2 комментария
  • Уроки по архитектуре android приложений и применению популярных сторонних библиотек?

    @thomas_white
    Вот тут все популярные приложения у которых открыты исходники, можешь посмотреть и по-изучать.
    Ответ написан
    Комментировать
  • Насколько необходимо использовать БД и ContentProvider в Android REST приложении?

    @FoxInSox
    Вам только так кажется, что кешировать нет необходимости. На деле кеширование решает массу проблем:
    • скорость работы приложения гораздо выше
    • работа с сетью расходует батарею
    • при отсутствии интернета или плохом качестве подключения приложение работает, а не превращается в "браузер"
    • траффик меньше (как для сервера, так и для пользователя мобильного приложения)
    • нагрузка на сервер меньше

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


    Разрабатывая приложение вы всегда должны помнить что масса пользователей имеет очень слабые устройства с медленным подключением к интернету или вообще с отсутствующем подключением.
    Ответ написан
    Комментировать
  • Что такое Push-уведомления?

    AMar4enko
    @AMar4enko
    Push уведомления инициируются сервером, без необходимости делать какие-либо периодические проверки в приложении.

    Схема примерно следующая:
    • Приложение регистрируется в GCM, получая уникальный id (это может происходить, например, при логине), после чего отправляет этот id на свой сервер, чаще всего с информацией о логине, чтобы на сервере привязать полученный от GCM id к пользователю.
    • Приложение слушает входящие сообщения с помощью .GcmBroadcastReceiver
    • При наступлении какого-то события на сервере (например, пользователю прислали сообщение) сервер вытаскивает нужный id, которое приложение передало в первом пункте и использует его для отправки уведомления через шлюз GCM
    • Шлюз сам разруливает куда чего слать
    • В приложении срабатывает код, который был подписан на получение уведомлений
    Ответ написан
    Комментировать