Страница 1 из 2

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

Добавлено: 27 май 2012, 23:00
damager82
В этом уроке:
- создаем более содержательные сообщения для Handler


Click here to read this article!

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

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

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

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

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

Добавлено: 07 дек 2012, 02:23
gera
почему

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

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

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

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

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

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

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

Добавлено: 12 дек 2012, 10:02
damager82
gera писал(а):почему

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

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

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

style="@android:style/Widget.ProgressBar.Horizontal"
?
Я перетащил компонент из панели, Eclipse сгенерил такой код

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

Добавлено: 18 дек 2012, 23:45
Blackbern
Символ ? применяется для поиска "стиля" в текущей "теме". В данном случае стиль ищется в системной теме андроид android:attr/progressBarStyleHorizontal

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

Добавлено: 05 мар 2013, 11:45
v_grechka
Сделал все как в уроке.
У меня программа открывает 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. Пример с более содержательными сообщен

Добавлено: 05 мар 2013, 13:37
v_grechka
С ошибкой разобрался. К процедуре 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. Пример с более содержательными сообщен

Добавлено: 10 мар 2013, 00:56
dumbDroid
Метод getFilesCount – получение кол-ва файлов.
Очепятка в уроке нет такого метода!

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

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

int filesCount = rand.nextInt(5); 

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

Добавлено: 10 апр 2013, 12:46
damager82
dumbDroid писал(а):
Метод getFilesCount – получение кол-ва файлов.
Очепятка в уроке нет такого метода!
Спасибо, пофиксил!

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

Добавлено: 11 авг 2013, 12:27
timur90
не очень понял
1)byte[]
2) return new byte[1024];
можно ли не использовать их ?

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

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

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

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

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

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

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

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

Добавлено: 26 дек 2014, 23:17
Svjatoslav
Здравствуйте! Сразу скажу что в 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;
	}

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

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

Могу ошибаться, с AQuery не работал, но если эта библиотека сделана по всем правилам, должно работать именно так как я сказал.

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

Добавлено: 29 дек 2014, 18:29
Svjatoslav
а как можно сделать чтобы метод выдавал данные когда запрос дал ответ???

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

Добавлено: 29 дек 2014, 19:23
KamiSempai
Ни как (Точнее есть, но он к данной ситуации не подходит).

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

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

Добавлено: 13 апр 2015, 14:43
Pavel-Pugach
Зачем мы ставим точку с запятой когда оверрайдим метод public void handleMessage(Message msg) {};?
Вконце после фигурных скобок.