Урок 86. AsyncTask. Знакомство, несложный пример

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 22 ноя 2012, 20:05

Методы getContext() и getBaseContext() не работают... Что делать в такой ситуации?
не работают так как doInbackground() работает в отдельном потоке и соответственно эти методы активити не будут работать. Но даже если вы передадите контекст и будете с ним работать то ничего хорошего не выйдет, так как работать в отдельном потоке с вью элементами не рекомендуется (а если не ошибаюсь с 3.х или с 4.х сразу exception).
P.S. это ж сколько там вьюшек у вас грузится в активити что они у вас аж 2 секунды занимают, обычно это просто не правильно разработана архитектура приложение, так как на экране не должно быть столько элементов...
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение AndreyI » 22 ноя 2012, 20:25

Ну так он, вроде, и не собирается выводить их на экран только создавать в отдельном потоке, все методы (инфляторы и т.п.) для этого будут работать, а вот если он попытается их добавить к экранным компонентам (addView) получит исключение. Но это можно сделать в onPostExecute

Tuhlom
Сообщения: 6
Зарегистрирован: 22 ноя 2012, 18:41

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Tuhlom » 23 ноя 2012, 00:09

Да, AndreyI всё правильно понял, в отдельном потоке я только подготовлю элементы к выводу на экран. Нужно вывести примерно 30 картинок, что занимает какое-то время, так что приходится выкручиваться. Спасибо большое за объяснения.

Столкнулся с проблемой передачи подготовленного View из одного activity в другое. Попробовал создать класс как промежуточное хранение View, но почему-то в месте обращения к нему вылетает NullPointerException
В MainActivity пишу:

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

public class MainActivity extends Activity{
	TextView tvInfo;
	Storage storage;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
                tvInfo = (TextView) findViewById(R.id.tvInfo);
                storage.save(tvInfo);
        }
}
Сам класс:

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

public class Storage {
	View saved;
	public void save(View v){
		saved = v;
	}

	public View load(){
		if (saved != null) {return saved;		
		} else return null;
	}
}

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 23 ноя 2012, 00:41

Нужно вывести примерно 30 картинок
Делаете на активити список или хоть галерею или ещё что нибудь что душа пожелает. Скажем всё таки список, каждая ячейка будет грузить картинку, прикручиваем прогресс барчики что бы пользователь видел что что то грузится, запускаем 30 асинхронных потоков и картинки грузятся все одновременно, и не надо лепить огородов и всё будет красиво.
но почему-то в месте обращения к нему вылетает NullPointerException
как вы передаёте данные из одного активити в другое? но всё таки гонять вьюшки между активити плохая идея.
Последний раз редактировалось rezak90 23 ноя 2012, 01:04, всего редактировалось 1 раз.
R.id.team
Политика на форуме запрещена

Tuhlom
Сообщения: 6
Зарегистрирован: 22 ноя 2012, 18:41

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Tuhlom » 23 ноя 2012, 00:44

Через putExtra нельзя передать элементы View.
При способе со списком и добавлением картинок в одном или нескольких асинхронных потоках всё равно будет какая-никакая, но задержка, просто пытался вообще её убрать. Но если варианта создать активити моментально нет, то наверное придётся делать так, как вы предложили. Только вопрос: разве 30 асинхронных потоков загрузят картинки быстрее, чем один?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 23 ноя 2012, 01:04

У меня лист из пятисот картинок и соответственно 500 потоков, никаких задержок нету, так что дело совсем не в количестве потоков и количестве картинок (разве что в качестве и разрешении).
Через putExtra нельзя передать элементы View.
ошибаетесь, можно передавать Object, а он базовый класс всех классов, так что можно передать всё что угодно =)
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение AndreyI » 23 ноя 2012, 08:38

Через putExtra можно передавать только Parcelable или Serializable т.е. те которые поддаются сериализации т.е. преобразованию в последовательность байт, простой объект конечно можно передать, его достаточно просто пометить как реализующий интерфейс Serializable (интерфейс- маркер, без абстрактных методов);
class MyClass implements Serializable {...}
Классы унаследованные от View не являются ни тем ни другим, их передать таким образом нельзя.

Обычно ссылками на объекты между потоками обмениваются через статические поля классов или синглтоны (классы позволяющие иметь только единственный экземпляр объекта).
Чтобы передавать через статические переменные особо ничего не нужно, просто пометить нужную переменную как статическую - в простейшем варианте (через public поле без геттеров и сеттеров)
public class MainActivity extends Activity{
puplic staticTextView tvInfo;

В другой Activity можно получить доступ к ней как MainActivity.tvInfo в общем-то работать будет , если вы просто вызываете одну Activity из другой первая остается в стеке, а значит не будет уничтожен ни сам экземпляр класса, ни тем более класс (объект класса class), значит наши статические поля будут жить.

Но правильней чаще всего делают свой класс MyApplication extends Application {...} и указывают его в манифесте как базовый для приложения
<application
android:name=".MyApplication"
...

Этот класс, можно сказать, является синглтоном и существует в единственном экземпляре для всего приложения. Доступ к которому всегда можно получить из любого компонента приложения вызовом getApplication() или getApplicationContext()
тогда ссылки на объекты можно хранить и передавать другим компонентам не только через статику, но и обычные поля классов puplic или private (через геттеры и сеттеры) т.е. в первом Activity мы определяем объект и сохраняем ссылку на него в поле объекта класса MyApplication (getApplication().myObject= tvInfo;) а в другом Activity мы всегда можем обратиться к этому объекты аналогичным образом. Это в случае Public полей, но правильней в ООП делать поля private и получать/устанавливать их через геттеры и сеттеры.

Все вышесказанное, разумеется, относится если компоненты приложения, которые обмениваются ссылками на свои объекты, находятся в одном процессе.
Если вы, отметите в манифесте для компонента - запускать в другом процессе, то для него будет создан свой объект класса Application и сам класс (class) будет загружен загрузчиком классов совершенно другой, т.е. статические поля у него тоже будут своими.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 23 ноя 2012, 09:03

Классы унаследованные от View не являются ни тем ни другим, их передать таким образом нельзя.
С этим хочу поспорить, если будет сегодня время то попробую передать.
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение AndreyI » 23 ноя 2012, 09:17

Я как-то по началу пытался создать свой кастомный View (не унаследованный, а именно полностью взять исходный код View) у меня ничего не получилось, т.к. в этом классе полно обращений к Internal классам и @hide методам. Я даже попробовал портировать все эти классы в библиотеку, в интернете нашел как это сделать, просто библиотека классов android.jar берется не из SDK, а вытягивается из эмулятора, т.е. непосредственно исполняемая, которая включает все internal классы и ресурсы, ну еще немного шаманства в ADT нужно сделать (изменить кое что). Но даже в этом случае у меня ничего толком не получилось :)
В последствии я подобные идеи даже не рассматривал, разве что какой-то простейший класс переписать.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение AndreyI » 23 ноя 2012, 09:50

Еще один момент не могу понять, зачем, собственно, нам передавать целиком объекты View? Если мы меняем только их отдельные свойства, так и нужно передавать эти свойства в виде простых или примитивных типов. Зачем передавать весь этот громоздкий объект? А если View еще и является контейнером со сложной иерархией внутри, так вообще ужас.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 23 ноя 2012, 10:57

это понятно что велосипед, но ради интереса и развития стоит попробывать =)
R.id.team
Политика на форуме запрещена

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение $01ny$hko » 18 янв 2013, 22:56

При первом запуске приложения нужно отправить запрос, который вернёт пользователю ID, с реализацией проблем нет. Подскажите правильно ли будет это реализовать в onCreate, чтобы это происходило только единожды за всё время существования приложения? Если да, то писать ли туда и сам запрос и AsyncTask и parsingDataInView(JSONArray jsonArray)? А если нет - то ГДЕ прописать всю логику?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение rezak90 » 18 янв 2013, 23:40

вся логика зависит от вас, и даже если вы пропишите всё в onCreate то не факт что это будет происходить один раз за всё время приложения так как onCreate может перезапускаться (всё зависит от ситуаций), но что вам мешает сделать такую конструкцию:
- если данных нету то загружаем,
- иначе делаем что то другое;
R.id.team
Политика на форуме запрещена

Ivan Zamurenko
Сообщения: 14
Зарегистрирован: 18 ноя 2012, 23:55

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Ivan Zamurenko » 04 фев 2013, 13:04

Добрый день уважаемые!! =) Очень рад вас всех видеть. Радостно глазу, что люди занимаются полезным делом, а не тратят впустую...

Мне нужна ваша помощь. На данном этапе, я хочу реализовать подключение к БД MySQL( да, я вам писал =) и подключился, но проблема теперь в другом немного =) ), через другой класс, а не в мейне, ибо не люблю когда сильно много напихано в мэйн.

Вы знаете, что начиная с энной версии андроида, в мейн потоке нельзя выполнить подключение к БД, для этого нужно будет создать вспомогательный поток и выполнить все там(спасибо rezak90). Вот что у меня написано в мейне:

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

public class AndroidMySQLClient extends Activity{

	TextView tvTOP, tvRoomsAreFree, tvTime;
	Button btnBooking;
	
	My_AsynchTask_Executable mt;
	Animation anim = null;
	 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.radisson_blu_main_page);
        
        tvTime = (TextView) findViewById (R.id.tvTime);
        tvTOP = (TextView) findViewById(R.id.tvTOP);
        tvRoomsAreFree = (TextView) findViewById (R.id.tvRoomsAreFree);
        
        btnBooking = (Button) findViewById (R.id.btnBooking);
        
        TodayDate(); AnimComponent(); 
        
	    mt = new My_AsynchTask_Executable();
	    mt.doInBackground();
	    mt.onPostExecute(null);
		tvRoomsAreFree.setText(mt.FreeRooms);

    }


Мой класс вспомогательного потока:

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

public class My_AsynchTask_Executable extends AsyncTask<Void, Void, Void> {
	
	MySQL mysql;
	String Logs = "";
	int FreeRooms;
	
	public void onPreExecute() {													
		super.onPreExecute();														
		Logs = Logs + "Begin AsynchTask \n";
		}																				
																																						
	public Void doInBackground(Void... params) {
		mysql = new MySQL();
		try {																		
		FreeRooms = mysql.db_Query();
		TimeUnit.SECONDS.sleep(2);											
		} catch (InterruptedException e) {									
		e.printStackTrace();												
		}																		
		return null;															 
		}																				
																																						
	public void onPostExecute(Void result) {									
	    super.onPostExecute(result);
	    Logs = Logs +"doInBackground done! /n";
	    //FreeRooms = mysql.db_Query();
		}									
}
И наконец мой класс самого подключения:

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

public class MySQL  {

	//My database values
	Connection SQLConnection = null;
	Statement st = null;
	ResultSet rs = null;
	int countBusyRooms = 0;
	int countFreeRooms = 0;
	
	String [] TableName = {"radisson_blue", "radisson_clients", "radisson_booking"};
	String DatabaseAddr = "jdbc:mysql://192.168.0.101:3306/hotel", 
			DatabaseLogin = "Client", 
			DatabasePass = "130393",
			sql_query = "SELECT radisson_blu.Flat FROM radisson_booking INNER JOIN radisson_blu ON radisson_booking.Flat = radisson_blu.Flat";
	
	String ResultView = "", Logs = "";
	
//DB_QUERY START
	public int db_Query () {
		try{ Class.forName("com.mysql.jdbc.Driver").newInstance();
			SQLConnection = DriverManager.getConnection(DatabaseAddr,DatabaseLogin,DatabasePass); //Connection to my DataBase
			} catch(Exception e) { Logs = "Operation Fail. Database not include \n";
			} try { 
					st = SQLConnection.createStatement(); //Create statement
					rs = st.executeQuery(sql_query); //Execute Query
					
					while (rs.next()) {countBusyRooms += 1;} //Query`s result
					Logs = "Operation success! \n";
					
					sql_query = "SELECT radisson_blu.Flat FROM radisson_blu";
					rs = st.executeQuery(sql_query); //Execute Query
					while (rs.next()) {countFreeRooms += 1;} //Query`s result
					
			} catch(Exception e){ Logs = "Operation Fail:  \n" + e; }
			
			countFreeRooms = countFreeRooms - countBusyRooms;
			return countFreeRooms;
	} 
//DB_QUERY END	
	
}
За код можете ругать, принимаю ВСЮ критику. Очень хочу научится писать правильно и понятно.

Проблема еще в доп. потоке... Я его прописал в методе onCreate, но командой mt.execute(), выполняется лишь метод onPreExecute, а другие два (doInBackground; onPostExecute) не выполняются. Может нежелательно писать в onCreate?

А иногда выбивает ошибку в MySQL - классе, в методе db_Query(), во втором try, nullPointerException, вроде бы так...на строке st = SQLConnection.createStatement();.

Очень странно еще то, что на эмуляторе(2.3.3 версии андроида), работает все то, что я выше описал и ошибок нет, но когда подключил аппарат (4.0.4 версии), сразу началась такая суматоха.

Поделитесь мыслями пожалуйста. =) Что я делаю не так? Вот особенно вопрос волнует самого Task, почему те два метода у меня не выполняются?

Спасибо за внимание.

Ivan Zamurenko
Сообщения: 14
Зарегистрирован: 18 ноя 2012, 23:55

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Ivan Zamurenko » 04 фев 2013, 16:05

Ivan Zamurenko писал(а):Проблема еще в доп. потоке... Я его прописал в методе onCreate, но командой mt.execute(), выполняется лишь метод onPreExecute, а другие два (doInBackground; onPostExecute) не выполняются. Может нежелательно писать в onCreate?

Я разобрался, ну или во всяком случае, у меня заработало =). Я перечитывал Ваш урок, и наконец таки включил мозги... Методы onPostExecute & onPreExecute, должны иметь связь с UI, ведь так? А я когда создал другой класс, лишил их этой возможности, по этому у меня он и не выполнялся и приходилось вызывать по методам(отдельно doInBackground) что очень некрасиво и неправильно.

Я Сtrl + C -> Ctrl + V код обратно к себе, в мэйн и пока что работает. =). Сейчас буду разбираться с БД.

Ivan Zamurenko
Сообщения: 14
Зарегистрирован: 18 ноя 2012, 23:55

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Ivan Zamurenko » 04 фев 2013, 16:20

Ivan Zamurenko писал(а):

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

public class MySQL  {
                                  try { 
					st = SQLConnection.createStatement(); //Create statement
					rs = st.executeQuery(sql_query); //Execute Query
					
					while (rs.next()) {countBusyRooms += 1;} //Query`s result
					Logs = "Operation success! \n";
					
					sql_query = "SELECT radisson_blu.Flat FROM radisson_blu";
					rs = st.executeQuery(sql_query); //Execute Query
					while (rs.next()) {countFreeRooms += 1;} //Query`s result
					
			} catch(Exception e){ Logs = "Operation Fail:  \n" + e; }
Проблема на этом участке. А именно в строке:

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

st = SQLConnection.createStatement(); //Create statement
Странно видеть тут ошибку, так как на эмуляторе все прекрасно работало.

Ivan Zamurenko
Сообщения: 14
Зарегистрирован: 18 ноя 2012, 23:55

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Ivan Zamurenko » 04 фев 2013, 16:38

Ivan Zamurenko писал(а):
Ivan Zamurenko писал(а):

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

public class MySQL  {
                                  try { 
					st = SQLConnection.createStatement(); //Create statement
					rs = st.executeQuery(sql_query); //Execute Query
					
					while (rs.next()) {countBusyRooms += 1;} //Query`s result
					Logs = "Operation success! \n";
					
					sql_query = "SELECT radisson_blu.Flat FROM radisson_blu";
					rs = st.executeQuery(sql_query); //Execute Query
					while (rs.next()) {countFreeRooms += 1;} //Query`s result
					
			} catch(Exception e){ Logs = "Operation Fail:  \n" + e; }
Проблема на этом участке. А именно в строке:

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

st = SQLConnection.createStatement(); //Create statement
Странно видеть тут ошибку, так как на эмуляторе все прекрасно работало.
Простите за беспокойство...я нашел ошибку. Я не подключил библиотеку... :( Все работает на ОК.

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

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Digetix » 06 фев 2013, 14:02

Здравствуйте. Прошу совета для правильного решения. Есть активити с картой.

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

@Override
	 public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.main); 
	    
	        makerDefault = this.getResources().getDrawable(R.drawable.knopka_red);
		itemizedOverlay = new MirItemizedOverlay(makerDefault);
		
	        mapView = (MapView) findViewById(R.id.mapview);
	 	mapView.setBuiltInZoomControls(true);
	 	mapController = mapView.getController();
	 	mapController.setZoom(17);
	 	
	 	List<Overlay> overlays = mapView.getOverlays();
	 	myLocationOverlay = new MyLocationOverlay(this, mapView);
	 	overlays.add(myLocationOverlay);
	 	myLocationOverlay.enableCompass();
	 	myLocationOverlay.enableMyLocation(); 	 	 
	    	    	    	 	
	 }	
Вот класс наложения

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

private class MirItemizedOverlay extends ItemizedOverlay {
         
		 private List<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
		 
		 public MirItemizedOverlay(Drawable defaultMarker) {
	         super(boundCenterBottom(defaultMarker));
		 }
		 

		 @Override
		 protected OverlayItem createItem(int i) {
		 return mOverlays.get(i);
		 }

		@Override
		 public int size() {
		 return mOverlays.size();
		 }

		 public void addOverlayItem(OverlayItem overlayItem) {
		 mOverlays.add(overlayItem);
		 populate();
		 }
		 
		 public void addOverlayItem (int lat, int lon, String title) {
			 overlayItem = new OverlayItem(point, nomer, null);
			 addOverlayItem(overlayItem);
			 }
		
	 }
Точки для наложения беру с сайта parse.com

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

                        ParseQuery query = new ParseQuery("MyObject");
	    	 	query.findInBackground(new FindCallback() {
	    		   public void done(List<ParseObject> myObject, ParseException e) {
	    		     if (e == null) {
	    		    	  
	    		        for ( i = 0; i < myObject.size(); i++) {	    		         
	    		         nomer = myObject.get(i).getNumber("Nomer");
	    		         name = myObject.get(i).getString("Name");	    		        
	    		         geo1Dub = myObject.get(i).getParseGeoPoint("location").getLatitude();
	    	                 geo2Dub = myObject.get(i).getParseGeoPoint("location").getLongitude();
	    	                 geo1Int = (int) (geo1Dub*1E6);
	    		         geo2Int = (int) (geo2Dub*1E6);
	    		         point = new GeoPoint(geo1Int, geo2Int);
	    				 overlayItem = new OverlayItem(point, nomer, name);	             
	    				 itemizedOverlay.addOverlayItem(geo1Int, geo2Int, name);    
	    	                         mapView.getOverlays().add(itemizedOverlay); 	    				 	    				
	    		        } 
	    		         			   
	    		     } else {	    		       
	    		    	 Toast.makeText(getBaseContext(), "Не работает", Toast.LENGTH_SHORT).show();	    		    	 
	    		     }
	    		   }
	    		 }); 
Пробовал ставить это запрос сразу в onCreate, точки отображаются верно, но если пробовать перемещать карту, она "тормозит", перемещается не плавно.
Пробовал сделать в отдельном потоке ( не знаю правильно ли), в onCreate добавил

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

new AsyncTaskDemo().execute(); 
И сам AsyncTaskDemo

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

private class AsyncTaskDemo extends AsyncTask<Void, Integer, Void> {
		 	 
	        @Override
	        protected void onPreExecute() {
	            super.onPreExecute();
	        }
	 
	        @Override
	        protected Void doInBackground(Void... params) {
	        	ParseQuery query = new ParseQuery("MyObject");
	    	 	query.findInBackground(new FindCallback() {
	    		   public void done(List<ParseObject> myObject, ParseException e) {
	    		     if (e == null) {
	    		    	  
	    		        for ( i = 0; i < myObject.size(); i++) {	    		         
	    		         nomer = myObject.get(i).getNumber("Nomer");
	    		         name = myObject.get(i).getString("Name");	    		        
	    		         geo1Dub = myObject.get(i).getParseGeoPoint("location").getLatitude();
	    	                 geo2Dub = myObject.get(i).getParseGeoPoint("location").getLongitude();
	    	                 geo1Int = (int) (geo1Dub*1E6);
	    				 geo2Int = (int) (geo2Dub*1E6);
	    				 point = new GeoPoint(geo1Int, geo2Int);
	    				 overlayItem = new OverlayItem(point, nomer, name);	             
	    				 itemizedOverlay.addOverlayItem(geo1Int, geo2Int, name);    
	    	                 mapView.getOverlays().add(itemizedOverlay); 	    				 	    				
	    		        } 
	    		         			   
	    		     } else {	    		       
	    		    	 Toast.makeText(getBaseContext(), "Не работает", Toast.LENGTH_SHORT).show();	    		    	 
	    		     }
	    		   }
	    		 }); 
	 
	            return null;
	        }
	 
	        @Override
	        protected void onPostExecute(Void result) {
	            super.onPostExecute(result);
	            Toast.makeText(MainActivity.this, "Работает!", Toast.LENGTH_LONG).show();	             	             
	        }	 
	    }
 
Всё отображается правильно, но "тормоза" с картой такие же.

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Digetix » 07 фев 2013, 13:39

Проблема решилась без АсинкТаск, в onCreate:

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

                 ParseQuery query = new ParseQuery("MyObject");
                 query.findInBackground(new FindCallback() {
                   public void done(List<ParseObject> myObject, ParseException e) {
                     if (e == null) {
                          
                        for ( i = 0; i < myObject.size(); i++) {                         
                         nomer = myObject.get(i).getNumber("Nomer");
                         name = myObject.get(i).getString("Name");                        
                         geo1Dub = myObject.get(i).getParseGeoPoint("location").getLatitude();
                         geo2Dub = myObject.get(i).getParseGeoPoint("location").getLongitude();
                         geo1Int = (int) (geo1Dub*1E6);
                         geo2Int = (int) (geo2Dub*1E6);
                         point = new GeoPoint(geo1Int, geo2Int);
                         overlayItem = new OverlayItem(point, nomer, name);                                
                         itemizedoverlay.addOverlay(overlayitem);                                                 
                        } 
                         mapOverlays.add(itemizedoverlay);
                         mapView.postInvalidate();
                                        
                     } else {                       
                         Toast.makeText(getBaseContext(), "Не работает", Toast.LENGTH_SHORT).show();                         
                     }
                   }
                 });
переносом строк

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

          mapOverlays.add(itemizedoverlay);
          mapView.postInvalidate();
за пределы цикла.
Где itemizedoverlay = new HelloItemizedOverlay(drawable, Main.this); это из туториала вот здесь

Сам спросил и сам ответил :D

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 86. AsyncTask. Знакомство, несложный пример

Сообщение Xpert043 » 28 апр 2013, 00:06

Попробовал выполнить этот урок у себя на компьютере. Получил такое. Чего можно починить, чтобы заработало?
Текст activity_main.xml:

[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/start">
</Button>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ProgressBar>
<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="">
</TextView>
</LinearLayout>[/syntax]
Вложения
Безымянный.png
Безымянный.png (73.47 КБ) 9038 просмотров

Ответить