Страницы

Поиск по вопросам

четверг, 10 января 2019 г.

Как передавать данные между Activity? [дубликат]

На данный вопрос уже ответили: Передача данных между Activity 2 ответа Есть long timefinal - время, которое нужно передать следующей Activity в TextView
Как правильно это сделать?


Ответ

Через интент:
FirstActivity.java
...
Intent intent = new Intent(this, SecondActivity.class); intent.putString("tag", timefinal); startActivity(intent);
...
SecondActivity.java
@Override protected void onCreate(Bundle savedInstanceState) { String timefinal = getIntent().getString("tag"); textView.setText(timefinal); }

System.OutOfMemoryException при добавлении элемента в словарь

Возникла проблема с ограничениями памяти для приложения. Из того что я понял: для приложения или под созданный объект (в моем случае это словарь) выделяется не больше 2Гб памяти. Хотелось бы создать словарь, который мог бы быть размера как минимум свободной части оперативной памяти. Как это сделать?
StackTrace исключения:
в System.Collections.Generic.Dictionary`2.Resize(Int32 newSize, Boolean forceNewHashCodes) в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) в System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)


Ответ

Сперва об OutOfMemoryException. Вопреки расхожему мнению, это исключение не означает, что закончилась память. Оно означает, что отсутствует требуемый непрерывный объем памяти. При этом свободной памяти еще может быть много, просто она фрагментирована. Например, CLR хочет выделить участок в 100 Мб, но есть только 20 свободных участков по 50 Мб. Свободная память есть, при этом OutOfMemoryException тоже есть.
Со словарем проблема заключается в том, что для изменении его размера требуется, грубо говоря, в два раза больше памяти, чем он занимает. Т.е. если на данный момент ваш словарь полностью заполнен и занимает 100 Мб (сам объект словаря, ключи/значения при этом могут храниться отдельно), то при добавлении очередного элемента нужно увеличить размер словаря, и на это требуется выделить 200 Мб памяти.
Теперь про ограничения. 2 Гб -- это объем памяти, выделяемый для 32-битного приложения (2^32). Для того, чтобы получить возможность кушать больше памяти (2^64), приложение должно быть 64-битным. При этом необходимо также включить опцию , которая позволит иметь массивы объемом больше 2 Гб.
Также вам стоит посмотреть внимательнее на ваш алгоритм, возможно его можно пересмотреть в сторону уменьшения потребления памяти.
Резюмируя в порядке важности:
Пересмотрите алгоритм (можете выложить его здесь отдельным вопросом и вам постараются подсказать). Сделайте приложение 64-битным и включить опцию

Как подключить 2-й выделенный IP

Приветствую, есть VDS и 2 выделенных IP, один давали с покупкой VDS (и сейчас доступ по нём открыт), а 2-й купил дополнительно.
Как мне подключить 2-й IP адрес к этому VDS, что бы при запросе на него открывались файлы, к примеру, из директории /var/www/site2/ не подключая к доменам? И доступ к директориям должен быть непосредственно по IP.
Спасибо.


Ответ

Для начала вам нужно назначить этот IP вашем сетевому интерфейсу. Как это делается - зависит от дистрибутива. Это либо файл /etc/network/interfaces для Debian/Ubuntu, либо /etc/sysconfig/network-scripts/ifcfg-* для CentOS/Fedora. Вы же знаете какая у вас ОС? Посмотрите её документацию.
Далее вам нужно сказать про этот IP веб-серверу. Если в директории Listen не указан конкретный IP - то Apache слушает все имеющиеся адреса. Если вас это устраивает - оставляйте, в противном случае впишите лишь новый адрес, если вы хотите что бы обращения принимались лишь на него. Далее - у вас уже есть VirtualHost который настроен на директорию /var/www/site2/ или нет? Если нет, создайте его, указав примерно такое:
> DocumentRoot "/var/www/site2/" <остальные_директивы_по_вкусу>
В конце не забудьте применить новую конфигурацию.

Вывод значения при условии, что подобного нету в другой таблице

Нужно вывести информацию с db_order, если нету ни одного повторения значения с db_order.id в таблице db_ips.order_id
Сами таблицы:
db_ips
db_order
Спасибо.


Ответ

Если я правильно понял ваш вопрос, то как то так:
SELECT db_order.* FROM db_order LEFT OUTER JOIN db_ips ON db_order.id = db_ips.order_id WHERE db_ips.order_id IS NULL;

Подзапрос SELECT

Есть таблица результатов экзаменов по русскому языку и математике:
declare @Results Table ( SchoolID nvarchar(200), ParticipID nvarchar(200), SubjectCode int, TestResult5 int )
--subjectcode: 1-русский язык, 2-математика
insert into @Results VALUES ('0001', 'Шахабов_Адам', 1, 4), ('0001', 'Асвадов_Аюб', 1, 3), ('0001', 'Майрукаев_Бекхан', 1, 3), ('0001', 'Шахабов_Адам', 2, 3), ('0001', 'Асвадов_Аюб', 2, 4), ('0001', 'Майрукаев_Бекхан', 2, 5), ('0002', 'Цуригова_Зайнап', 2, 5), ('0002', 'Майрукаев_Роза', 2, 4), ('0002', 'Муциев_Адлан', 2, 3), ('0002', 'Цуригова_Зайнап', 1, 3), ('0002', 'Майрукаев_Роза', 1, 4), ('0002', 'Муциев_Адлан', 1, 5)

Условие: Необходимо извлечь список школ (SchoolID), у которых число участников, получивших отметку 3 по русскому языку, больше 1.
Как я это делаю:
select schoolid from
(select schoolid, SUM(CASE WHEN subjectcode = 1 and testresult5 = 3 then 1 else 0 end) c from @Results group by schoolid) temp_table
where c > 1

Необходимо: оптимизировать данный запрос.
Конечно, на этом примере код выглядит не совсем большим. Я специально показал маленький пример. Все ли правильно я делаю? Можно ли как-то обойтись без подзапроса в этом случае?


Ответ

Вам поможет HAVING:
SELECT schoolid, COUNT(ParticipID) FROM @Results WHERE subjectcode = 1 AND testresult5 = 3 GROUP BY schoolid HAVING COUNT(ParticipID) > 1
http://sqlfiddle.com/#!9/fe6b2/1/0
https://ru.wikipedia.org/wiki/Having_(SQL)

Корректное отображение даты из Unix UTC

От сервера приходит дата в формате "Time of data calculation, unix, UTC" и значение равно, например 1473777482.
В приложении делаю обработку для более читабильного формата и присваиваю значение в поле TextView:
Date date = new Date(resp.getDt() * 1000) mDateTextView.setText(new SimpleDateFormat("EE, dd MMMM yyyy, HH:mm").format(date));
И вроде все ничего, но только отображается 14 сентября и время 2 часа (ночи). Каким образом можно привести с актуальному текущему времени по Мск.?
В теории можно просто отнять от текущего времени константу, которая равна разнице, но на мой взгляд это не очень корректно, да и скорее всего существует какой то способ, но я его не обнаружил.


Ответ

Просто установите нужную зону так:
SimpleDateFormat format = new SimpleDateFormat("EE, dd MMMM yyyy, HH:mm") format.setTimeZone(TimeZone.getTimeZone("UTC"));

Получить кнопку,на которой находится курсор

Добрый день. Несколько кнопок размещены на TableLayoutPanel. Необходимо при наведении мыши на кнопку выводить в лейбле(расположенном ниже) её Tag. Не понял, как использовать GetChildAtPoint, подскажите пожалуйста.


Ответ

Зачем использовать GetChildAtPoint, если есть событие MouseEnter? Можно задать для любого количества кнопок один и тот же обработчик (в коде или в дизайнере), примерно такого вида:
private void TableLayoutPanelButton_MouseEnter(object sender, EventArgs e) { var tag = ((Button)sender).Tag; // делаем что нужно }