Урок 82. Handler. Пример с более содержательными сообщениями

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 82. Handler. Пример с более содержательными сообщениями

Сообщение damager82 » 27 май 2012, 23:00

В этом уроке:
- создаем более содержательные сообщения для Handler


Click here to read this article!
Последний раз редактировалось damager82 20 май 2017, 20:08, всего редактировалось 7 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

kolipass
Сообщения: 50
Зарегистрирован: 16 апр 2012, 14:10

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение kolipass » 29 май 2012, 09:20

Столкнулся с проблемой асинхронной подгрузки данных при открытии активити. По задумке мне нужно подгрузить в потоке массив объектов и этот массив скормить заранее подготовленному адаптеру для ListView. Но как выяснилось не могу перерисовать ListView уже после формирования экрана.
Внимание вопрос: как перерисовать ListView в рантайме после установки адаптера
upd. Решил задачу через AsyncTask.

urfinjuzz
Сообщения: 1
Зарегистрирован: 13 авг 2012, 04:05

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение urfinjuzz » 01 сен 2012, 09:55

Интересно, а как можно отправить сообщение в новый поток, в часности, нужно передать объект, как параметр для тяжелой функции, которая должна отработать в новом потоке?

gera
Сообщения: 9
Зарегистрирован: 11 окт 2012, 23:30

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение gera » 07 дек 2012, 02:23

почему

Код: Выделить всё

style="?android:attr/progressBarStyleHorizontal" 
а не

Код: Выделить всё

style="@android:style/Widget.ProgressBar.Horizontal"
?

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение brucemax » 07 дек 2012, 12:30

urfinjuzz писал(а):Интересно, а как можно отправить сообщение в новый поток, в часности, нужно передать объект, как параметр для тяжелой функции, которая должна отработать в новом потоке?
AsynkTask в помощь!)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение damager82 » 12 дек 2012, 10:02

gera писал(а):почему

Код: Выделить всё

style="?android:attr/progressBarStyleHorizontal" 
а не

Код: Выделить всё

style="@android:style/Widget.ProgressBar.Horizontal"
?
Я перетащил компонент из панели, Eclipse сгенерил такой код
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Blackbern
Сообщения: 2
Зарегистрирован: 18 дек 2012, 23:31

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение Blackbern » 18 дек 2012, 23:45

Символ ? применяется для поиска "стиля" в текущей "теме". В данном случае стиль ищется в системной теме андроид android:attr/progressBarStyleHorizontal

v_grechka
Сообщения: 20
Зарегистрирован: 09 авг 2012, 13:30

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение v_grechka » 05 мар 2013, 11:45

Сделал все как в уроке.
У меня программа открывает 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;
	      }
	    }

v_grechka
Сообщения: 20
Зарегистрирован: 09 авг 2012, 13:30

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение v_grechka » 05 мар 2013, 13:37

С ошибкой разобрался. К процедуре 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();
		}
так вот именно на поднятие вот этого тоста и ругаласаь программа. Что приводило к эксепшен, это отдельный вопрос, не относящийся к теме потоков.

dumbDroid
Сообщения: 2
Зарегистрирован: 10 мар 2013, 00:52

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение dumbDroid » 10 мар 2013, 00:56

Метод getFilesCount – получение кол-ва файлов.
Очепятка в уроке нет такого метода!

Есть переменная:

Код: Выделить всё

int filesCount = rand.nextInt(5); 

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение damager82 » 10 апр 2013, 12:46

dumbDroid писал(а):
Метод getFilesCount – получение кол-ва файлов.
Очепятка в уроке нет такого метода!
Спасибо, пофиксил!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

timur90
Сообщения: 5
Зарегистрирован: 10 авг 2013, 03:52

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение timur90 » 11 авг 2013, 12:27

не очень понял
1)byte[]
2) return new byte[1024];
можно ли не использовать их ?

korsaj
Сообщения: 7
Зарегистрирован: 04 июн 2013, 12:01

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение korsaj » 14 авг 2013, 13:19

Здравствуйте. Пытаюсь работать с блютузом. Из потока отправляю сообщения главному активити. Принимаю их, превращаю в беззнаковый int (точнее сказать положительный) и вывожу в ListView. Получаю данные от блютуз модуля к которому подключен автомобильный блок управления (БУ). БУ шлет данные без прерывно.
Так вот проблема: данные вначале (сразу после соединения) идут нормально (принятый пакет примерно равен 120 байтам), все отображается в ListView, но спустя короткого промежутка времени (~0.2C) на дисплее появляются лишь обрывки данных по 1 - 10 байт.
В чем проблема? Возможно я просто не успеваю их обрабатывать? Что тогда делать? Как выйти из данной ситуации? Собственно все сообщения мне не нужны, только их часть, все равно они повторяются.
Может стоит приостанавливать прием данных?

korsaj
Сообщения: 7
Зарегистрирован: 04 июн 2013, 12:01

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение korsaj » 15 авг 2013, 15:07

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

aleksbim
Сообщения: 81
Зарегистрирован: 02 фев 2013, 02:52

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение aleksbim » 21 авг 2014, 16:15

Присоединяюсь к вопросу, оставшегося без ответа.
1)byte[]
2) return new byte[1024]
3) saveFile((byte[]) msg.obj);
Что это и зачем?

rand.nextInt(5); ?????

Svjatoslav
Сообщения: 2
Зарегистрирован: 26 дек 2014, 23:02

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение Svjatoslav » 26 дек 2014, 23:17

Здравствуйте! Сразу скажу что в 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. Пример с более содержательными сообщен

Сообщение KamiSempai » 27 дек 2014, 01:33

Вы начинаете использовать Map не дождавшись ответа с сервера. Объект contact будет содержать какие либо данные только после того как отработает метод callback.
Собственно, в конце этого метода можно делать какие либо действия по отображению полученной информации. Я более чем уверен, этот метод вызывается в UI потоке, а следовательно, обращаться элементам интерфейса можно прямо из него.
Handler тут не нужен.

Могу ошибаться, с AQuery не работал, но если эта библиотека сделана по всем правилам, должно работать именно так как я сказал.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Svjatoslav
Сообщения: 2
Зарегистрирован: 26 дек 2014, 23:02

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение Svjatoslav » 29 дек 2014, 18:29

а как можно сделать чтобы метод выдавал данные когда запрос дал ответ???

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение KamiSempai » 29 дек 2014, 19:23

Ни как (Точнее есть, но он к данной ситуации не подходит).

Можно передать в метод определенный объект(колбэк) метод которого будет вызван по завершении.
А еще, здесь, весьма кстати, будет удобно воспользоваться AsyncTask.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Урок 82. Handler. Пример с более содержательными сообщен

Сообщение Pavel-Pugach » 13 апр 2015, 14:43

Зачем мы ставим точку с запятой когда оверрайдим метод public void handleMessage(Message msg) {};?
Вконце после фигурных скобок.

Ответить