Урок 82. Handler. Пример с более содержательными сообщениями
Урок 82. Handler. Пример с более содержательными сообщениями
В этом уроке:
- создаем более содержательные сообщения для Handler
Click here to read this article!
- создаем более содержательные сообщения для Handler
Click here to read this article!
Последний раз редактировалось damager82 20 май 2017, 20:08, всего редактировалось 7 раз.
Re: Урок 82. Handler. Пример с более содержательными сообщен
Столкнулся с проблемой асинхронной подгрузки данных при открытии активити. По задумке мне нужно подгрузить в потоке массив объектов и этот массив скормить заранее подготовленному адаптеру для ListView. Но как выяснилось не могу перерисовать ListView уже после формирования экрана.
Внимание вопрос: как перерисовать ListView в рантайме после установки адаптера
upd. Решил задачу через AsyncTask.
Внимание вопрос: как перерисовать ListView в рантайме после установки адаптера
upd. Решил задачу через AsyncTask.
Re: Урок 82. Handler. Пример с более содержательными сообщен
Интересно, а как можно отправить сообщение в новый поток, в часности, нужно передать объект, как параметр для тяжелой функции, которая должна отработать в новом потоке?
Re: Урок 82. Handler. Пример с более содержательными сообщен
почему
а не
?
Код: Выделить всё
style="?android:attr/progressBarStyleHorizontal"
Код: Выделить всё
style="@android:style/Widget.ProgressBar.Horizontal"
Re: Урок 82. Handler. Пример с более содержательными сообщен
AsynkTask в помощь!)urfinjuzz писал(а):Интересно, а как можно отправить сообщение в новый поток, в часности, нужно передать объект, как параметр для тяжелой функции, которая должна отработать в новом потоке?
Re: Урок 82. Handler. Пример с более содержательными сообщен
Я перетащил компонент из панели, Eclipse сгенерил такой кодgera писал(а):почемуа неКод: Выделить всё
style="?android:attr/progressBarStyleHorizontal"
?Код: Выделить всё
style="@android:style/Widget.ProgressBar.Horizontal"
Re: Урок 82. Handler. Пример с более содержательными сообщен
Символ ? применяется для поиска "стиля" в текущей "теме". В данном случае стиль ищется в системной теме андроид android:attr/progressBarStyleHorizontal
Re: Урок 82. Handler. Пример с более содержательными сообщен
Сделал все как в уроке.
У меня программа открывает xml файл, читает его содержимое построчно и этот процесс отображается индикатором
Периодически выскакивает ошибка. Один раз помогла деинсталяция проги.
Can't create handler inside thread that has not called Looper.prepare()
Хеееллп!!!! Ошибка валится на функции RecordCount(DIR_SD,FILENAME_SD);
У меня программа открывает xml файл, читает его содержимое построчно и этот процесс отображается индикатором
Периодически выскакивает ошибка. Один раз помогла деинсталяция проги.
Can't create handler inside thread that has not called Looper.prepare()
Хеееллп!!!! Ошибка валится на функции RecordCount(DIR_SD,FILENAME_SD);
Код: Выделить всё
//------------------------------------------------handler-----------------------
h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case STATUS_NONE:
tvStatus.setText("Not connected");
pbDownload.setVisibility(View.GONE);
break;
case STATUS_CONNECTING:
tvStatus.setText("Connecting");
break;
case STATUS_CONNECTED:
tvStatus.setText("Detecting rec_cnt");
break;
case STATUS_DOWNLOAD_START:
tvStatus.setText("Start download " + msg.arg1 + " records");
pbDownload.setMax(msg.arg1);
pbDownload.setProgress(0);
pbDownload.setVisibility(View.VISIBLE);
break;
case STATUS_DOWNLOAD_FILE:
pbDownload.setMax(Rec_cnt);
pbDownload.setProgress(msg.arg1);
tvStatus.setText("Downloading. Left " + msg.arg2 + " records"+ " from "+msg.obj.toString());
pbDownload.setProgress(msg.arg1);
break;
case STATUS_DATABASE_INSERT:
pbDownload.setVisibility(View.VISIBLE);
pbDownload.setMax(Rec_cnt);
tvStatus.setText("Inserting. Left " + msg.arg2 + " records "+"AccountID="+ msg.obj.toString());
pbDownload.setProgress(msg.arg1);
break;
case STATUS_DOWNLOAD_END:
tvStatus.setText("Download complete!");
break;
case STATUS_DOWNLOAD_NONE:
tvStatus.setText("No files for download");
break;
}
};
};
h.sendEmptyMessage(STATUS_NONE);
}
//------------------------------------------------------------------------------
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnTest:
Thread t = new Thread(new Runnable() {
Message msg;
public void run() {
try {
h.sendEmptyMessage(STATUS_CONNECTING);
TimeUnit.SECONDS.sleep(1);
Rec_cnt=RecordCount(DIR_SD,FILENAME_SD);
h.sendEmptyMessage(STATUS_CONNECTED);
if (Rec_cnt == 0) {
h.sendEmptyMessage(STATUS_DOWNLOAD_NONE);
TimeUnit.MILLISECONDS.sleep(1500);
h.sendEmptyMessage(STATUS_NONE);
return;
}
msg = h.obtainMessage(STATUS_DOWNLOAD_START, Rec_cnt, 0);
TimeUnit.SECONDS.sleep(1);
// отправляем
h.sendMessage(msg);
//---------------------------------Чтение файла ---------------------------------------------------------------
XML_text=readFileSD(DIR_SD,FILENAME_SD,0);
//-------------------------------------------------------------------------------------------------------------
//---------------------------------Парсер, встака в БД----------------------------------------------------------
insertTask();
//-------------------------------------------------------------------------------------------------------------
h.sendEmptyMessage(STATUS_DOWNLOAD_END);
// отключаемся
TimeUnit.MILLISECONDS.sleep(1500);
h.sendEmptyMessage(STATUS_NONE);
}
catch (Throwable t) {
// Log.d("INSRT", "Ошибка: " + t.toString());
showMessage(FileTSActivity.this,"Ошибка при запуске потока: " + t.toString(), 1);
}
}
});
t.start();
break;
default:
break;
}
}
Re: Урок 82. Handler. Пример с более содержательными сообщен
С ошибкой разобрался. К процедуре RecordCount(DIR_SD,FILENAME_SD);
она имеет посредственное отношение.
в коде кетч
была ссылка на процедуру поднятия ТОСТА
так вот именно на поднятие вот этого тоста и ругаласаь программа. Что приводило к эксепшен, это отдельный вопрос, не относящийся к теме потоков.
она имеет посредственное отношение.
в коде кетч
Код: Выделить всё
catch (Throwable t) {
Log.d("INSRT", "Ошибка: " + t.toString());
// showMessage(FileTSActivity.this,"public int RecordCount Ошибка при загрузке XML-документа: " + t.toString(), 1);
}
Код: Выделить всё
public static void showMessage(Context c, String text, int duration) {
Toast toast = Toast.makeText(c, text, duration);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
Re: Урок 82. Handler. Пример с более содержательными сообщен
Очепятка в уроке нет такого метода!Метод getFilesCount – получение кол-ва файлов.
Есть переменная:
Код: Выделить всё
int filesCount = rand.nextInt(5);
Re: Урок 82. Handler. Пример с более содержательными сообщен
Спасибо, пофиксил!dumbDroid писал(а):Очепятка в уроке нет такого метода!Метод getFilesCount – получение кол-ва файлов.
Re: Урок 82. Handler. Пример с более содержательными сообщен
не очень понял
1)byte[]
2) return new byte[1024];
можно ли не использовать их ?
1)byte[]
2) return new byte[1024];
можно ли не использовать их ?
Re: Урок 82. Handler. Пример с более содержательными сообщен
Здравствуйте. Пытаюсь работать с блютузом. Из потока отправляю сообщения главному активити. Принимаю их, превращаю в беззнаковый int (точнее сказать положительный) и вывожу в ListView. Получаю данные от блютуз модуля к которому подключен автомобильный блок управления (БУ). БУ шлет данные без прерывно.
Так вот проблема: данные вначале (сразу после соединения) идут нормально (принятый пакет примерно равен 120 байтам), все отображается в ListView, но спустя короткого промежутка времени (~0.2C) на дисплее появляются лишь обрывки данных по 1 - 10 байт.
В чем проблема? Возможно я просто не успеваю их обрабатывать? Что тогда делать? Как выйти из данной ситуации? Собственно все сообщения мне не нужны, только их часть, все равно они повторяются.
Может стоит приостанавливать прием данных?
Так вот проблема: данные вначале (сразу после соединения) идут нормально (принятый пакет примерно равен 120 байтам), все отображается в ListView, но спустя короткого промежутка времени (~0.2C) на дисплее появляются лишь обрывки данных по 1 - 10 байт.
В чем проблема? Возможно я просто не успеваю их обрабатывать? Что тогда делать? Как выйти из данной ситуации? Собственно все сообщения мне не нужны, только их часть, все равно они повторяются.
Может стоит приостанавливать прием данных?
Re: Урок 82. Handler. Пример с более содержательными сообщен
Все решилось само собой, а точнее мной. Ничего нигде не теряется, все успевает обробатыватся. Все что я сделал - собираю массив в хендлере до заполнения, а уж затем отправляю главному активити.
Re: Урок 82. Handler. Пример с более содержательными сообщен
Присоединяюсь к вопросу, оставшегося без ответа.
1)byte[]
2) return new byte[1024]
3) saveFile((byte[]) msg.obj);
Что это и зачем?
rand.nextInt(5); ?????
1)byte[]
2) return new byte[1024]
3) saveFile((byte[]) msg.obj);
Что это и зачем?
rand.nextInt(5); ?????
-
- Сообщения: 2
- Зарегистрирован: 26 дек 2014, 23:02
Re: Урок 82. Handler. Пример с более содержательными сообщен
Здравствуйте! Сразу скажу что в Java новичок, так что строго не судите =) Работаю с апишкой, используя AQuery библиотеку... когда дело дойшло до получения данных с апи, то возникла следующая проблема: вот кусок кода, какой отправляет запрос и успешно возвращает результат, только функция всегда возвращает пустой Map, не дождавшысь ответа от сервера... ето нужно как-то через Handler обрабатывать??? И если да то как????
Код: Выделить всё
private static AQuery aq;
private Map<String, String> contact;
private Context context;
private final String url = "http://test-url.com/";
public Map<String, String> getContact(String phoneNumber){
aq = new AQuery(context);
contact = new HashMap<String, String>();
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", ConstansApp.PACKAGE_ID_GET_CONTACTS);
params.put("method", "get_contact");
JSONArray list = new JSONArray();
list.put(phoneNumber);
params.put("phone_num", list);
Map<String, String> data = new HashMap<String, String>();
data.put("data", new JSONObject(params).toString());
Log.d(MyLogs.LOG_CALL, "data: " + data);
aq.ajax(url, data, JSONObject.class, new AjaxCallback<JSONObject>(){
@Override
public void callback(String url, JSONObject json,
AjaxStatus status) {
try {
int result = Integer.parseInt(json.getString("result"));
if (result == -1) {
String desc = json.getString("desc");
} else if (result == 0) {
String phone_num = json.getString("phone_num");
String name = json.getString("name");
contact.put("phone_num", phone_num);
contact.put("name", name);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return contact;
}
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 82. Handler. Пример с более содержательными сообщен
Вы начинаете использовать Map не дождавшись ответа с сервера. Объект contact будет содержать какие либо данные только после того как отработает метод callback.
Собственно, в конце этого метода можно делать какие либо действия по отображению полученной информации. Я более чем уверен, этот метод вызывается в UI потоке, а следовательно, обращаться элементам интерфейса можно прямо из него.
Handler тут не нужен.
Могу ошибаться, с AQuery не работал, но если эта библиотека сделана по всем правилам, должно работать именно так как я сказал.
Собственно, в конце этого метода можно делать какие либо действия по отображению полученной информации. Я более чем уверен, этот метод вызывается в UI потоке, а следовательно, обращаться элементам интерфейса можно прямо из него.
Handler тут не нужен.
Могу ошибаться, с AQuery не работал, но если эта библиотека сделана по всем правилам, должно работать именно так как я сказал.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
-
- Сообщения: 2
- Зарегистрирован: 26 дек 2014, 23:02
Re: Урок 82. Handler. Пример с более содержательными сообщен
а как можно сделать чтобы метод выдавал данные когда запрос дал ответ???
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 82. Handler. Пример с более содержательными сообщен
Ни как (Точнее есть, но он к данной ситуации не подходит).
Можно передать в метод определенный объект(колбэк) метод которого будет вызван по завершении.
А еще, здесь, весьма кстати, будет удобно воспользоваться AsyncTask.
Можно передать в метод определенный объект(колбэк) метод которого будет вызван по завершении.
А еще, здесь, весьма кстати, будет удобно воспользоваться AsyncTask.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
-
- Сообщения: 15
- Зарегистрирован: 31 мар 2015, 15:17
Re: Урок 82. Handler. Пример с более содержательными сообщен
Зачем мы ставим точку с запятой когда оверрайдим метод public void handleMessage(Message msg) {};?
Вконце после фигурных скобок.
Вконце после фигурных скобок.