<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF160%3AAndroid-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5</id>
		<title>LXF160:Android-про­грам­ми­ро­ва­ние - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF160%3AAndroid-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;action=history"/>
		<updated>2026-05-13T14:28:21Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18227&amp;oldid=prev</id>
		<title>Olkol в 08:05, 29 сентября 2018</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18227&amp;oldid=prev"/>
				<updated>2018-09-29T08:05:00Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 08:05, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Постояные рубрики]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Постояные рубрики]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Android]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Android&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]&lt;/ins&gt;]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''» Про­грам­ми­ро­ва­ние. С базами данных Android умеет работать и в облаках'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''» Про­грам­ми­ро­ва­ние. С базами данных Android умеет работать и в облаках'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18225&amp;oldid=prev</id>
		<title>Olkol: /* Ин­ди­ка­тор вы­полнения про­цес­са */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18225&amp;oldid=prev"/>
				<updated>2018-09-29T08:00:21Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ин­ди­ка­тор вы­полнения про­цес­са&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 08:00, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 330:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 330:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: LXF160.code_android.r_opt1.jpeg|left |400px |thumb|&amp;gt; Не ос­тав­ляй­те сво­их поль­зо­ва­те­лей во мра­ке — при­ят­ный ин­ди­ка­тор вы­пол­не­ния про­цес­са со­об­щит им, что де­ла­ет при­ло­же­ние.]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: LXF160.code_android.r_opt1.jpeg|left |400px |thumb|&amp;gt; Не ос­тав­ляй­те сво­их поль­зо­ва­те­лей во мра­ке — при­ят­ный ин­ди­ка­тор вы­пол­не­ния про­цес­са со­об­щит им, что де­ла­ет при­ло­же­ние.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Ин­ди­ка­тор вы­полнения про­цес­са==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Ин­ди­ка­тор вы­полнения про­цес­са==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;У вас мо­жет возник­нуть же­лание со­об­щать поль­зо­ва­те­лю о том, что при­ло­жение де­ла­ет в фо­но­вом ре­жи­ме. В AsyncTask есть удоб­ный ме­тод для от­прав­ки ин­фор­ма­ции о хо­де про­цес­са об­рат­но в глав­ную нить – onProgressUpdate(). Что­бы им восполь­зо­вать­ся, сна­ча­ла нуж­но убе­дить­ся, что вто­рой ар­гу­мент шаб­лон­но­го ти­па AsyncTask был за­дан вер­но. Мы восполь­зу­ем­ся CharSequence для ото­бра­жения в окне хо­да вы­полнения про­цес­са. Ме­тод onProgressUpdate() вы­гля­дит так:&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;private final ProgressDialog dialog = new&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ProgressDialog(ToDo.this);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;@Override protected void onProgressUpdate(CharSequence... message) {&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;dialog.setMessage(message[0]);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;dialog.show();&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Что­бы восполь­зо­вать­ся этим, до­бавь­те в лю­бом мес­те клас­са, где долж­но поя­вить­ся со­об­щение, вы­зов publishProgress&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;(“со­об­щение”);. Диа­лог так­же нуж­но бу­дет за­крыть ме­то­дом dialog.dismiss() в onPostExecute().&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Од­на­ко при за­пуске этой вер­сии вы за­ме­ти­те од­ну про­бле­му, свя­зан­ную с этим ок­ном: оно бу­дет ме­шать за­да­че пол­но­стью ра­бо­тать в фоне, так как фо­кус пе­рей­дет на ок­но со­об­щения. Это мо­жет быть удоб­но, ес­ли вы не хо­ти­те, что­бы поль­зо­ва­те­ли ра­бо­та­ли с при­ло­жением при вы­полнении за­да­чи в фоне – так они ви­дят, что при­ло­жение не за­вис­ло.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Ес­ли вы хо­ти­те, что­бы поль­зо­ва­те­ли мог­ли ра­бо­тать с при­ло­жением, есть дру­гой ва­ри­ант – по­ка­зать ин­ди­ка­тор вы­полнения про­цес­са в за­го­лов­ке ок­на. Это про­сто. Для на­ча­ла до­бавь­те эту стро­ку в ме­тод onCreate() в ToDo.java (пе­ред вы­зо­вом setContentView):&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;setContentView(R.layout.main);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;По­лу­чи­те на­строй­ки диа­ло­го­во­го ок­на в SyncDataTask и до­бавь­те в onPreExecute() стро­ку&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ToDo.this.setProgressBarIndeterminateVisibility(true);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;а в onPostExecute() – стро­ку&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ToDo.this.setProgressBarIndeterminateVisibility(false);&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;(здесь не ис­поль­зу­ет­ся ме­тод onProgressUpdate(), так как мы не об­нов­ля­ем ин­фор­ма­цию о хо­де вы­полнения про­цес­са, а про­сто по­ка­зы­ва­ем, что де­ла идут). Го­то­во. Ском­пи­ли­руй­те и за­пусти­те про­грам­му, и вы уви­ди­те ин­ди­ка­тор вы­полнения про­цес­са в пра­вом верхнем уг­лу. Сле­дую­щее, о чем нуж­но по­ду­мать, ес­ли вы хо­ти­те про­дол­жить раз­ра­бот­ку при­ло­жения – что про­изой­дет, ес­ли дей­ст­вие бу­дет за­вер­ше­но или пе­ре­за­пу­ще­но в про­цес­се вы­полнения? Это осо­бен­но ак­ту­аль­но с AsyncTask, так как те­перь у нас несколь­ко нитей. |&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;===Ин­ди­ка­тор вы­полнения про­цес­са===&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;У вас мо­жет возник­нуть же­лание со­об­щать поль­зо­ва­те­лю о том, что при­ло­жение де­ла­ет в фо­но­вом ре­жи­ме. В AsyncTask есть удоб­ный ме­тод для от­прав­ки ин­фор­ма­ции о хо­де про­цес­са об­рат­но в глав­ную нить – onProgressUpdate(). Что­бы им восполь­зо­вать­ся, сна­ча­ла нуж­но убе­дить­ся, что вто­рой ар­гу­мент шаб­лон­но­го ти­па AsyncTask был за­дан вер­но. Мы восполь­зу­ем­ся CharSequence для ото­бра­жения в окне хо­да вы­полнения про­цес­са. Ме­тод onProgressUpdate() вы­гля­дит так:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;У вас мо­жет возник­нуть же­лание со­об­щать поль­зо­ва­те­лю о том, что при­ло­жение де­ла­ет в фо­но­вом ре­жи­ме. В AsyncTask есть удоб­ный ме­тод для от­прав­ки ин­фор­ма­ции о хо­де про­цес­са об­рат­но в глав­ную нить – onProgressUpdate(). Что­бы им восполь­зо­вать­ся, сна­ча­ла нуж­но убе­дить­ся, что вто­рой ар­гу­мент шаб­лон­но­го ти­па AsyncTask был за­дан вер­но. Мы восполь­зу­ем­ся CharSequence для ото­бра­жения в окне хо­да вы­полнения про­цес­са. Ме­тод onProgressUpdate() вы­гля­дит так:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18224&amp;oldid=prev</id>
		<title>Olkol: /* Асин­хрон­ные за­да­чи */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18224&amp;oldid=prev"/>
				<updated>2018-09-29T07:58:21Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Асин­хрон­ные за­да­чи&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:58, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы де­ла­ем здесь, вы­пол­ня­ет­ся в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са Дей­ст­вия. Это неслож­но с точ­ки зрения про­грам­ми­ро­вания, но не слиш­ком хо­ро­шо с точ­ки зрения поль­зо­ва­те­ля. Ес­ли при­ло­жению нуж­но мно­го вре­мени на под­клю­чение к сер­ве­ру, оно за­тормозит. В луч­шем слу­чае это про­сто нервирует поль­зо­ва­те­ля; в худ­шем, ес­ли при­ло­жение бу­дет молчать достаточно дол­го, поль­зо­ва­тель мо­жет не до­ж­даться своего счастья и при­ну­ди­тель­но за­крыть при­ло­жение. Что­бы обой­ти эту про­бле­му, нам нуж­на дру­гая нить для вы­полнения опе­ра­ций по ра­бо­те с ба­зой дан­ных. Го­во­ря о нитях, важ­но помнить, что все опе­ра­ции с гра­фи­че­­ским ин­тер­фей­сом долж­ны вы­пол­нять­ся толь­ко в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са, так как ин­ст­ру­мен­та­рий поль­зо­ва­тель­ско­го ин­тер­фей­са Android не яв­ля­ет­ся thread-safe (то есть не га­ран­ти­ру­ет безо­пас­ной ра­бо­ты при од­но­вре­мен­ном вы­полнении в несколь­ких нитях). И вся ра­бо­та с ко­дом ин­ст­ру­мен­та­рия долж­на про­из­во­дить­ся в «глав­ной» нити поль­зо­ва­тель­ско­го ин­тер­фей­са, и лю­бые из­менения в гра­фи­че­­ском ин­тер­фей­се (на­при­мер, по­втор­ное за­полнение спи­ска по­сле син­хрониза­ции с ба­зой дан­ных) долж­ны вы­пол­нять­ся в глав­ной нити, а не в на­шей вто­рой нити.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы де­ла­ем здесь, вы­пол­ня­ет­ся в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са Дей­ст­вия. Это неслож­но с точ­ки зрения про­грам­ми­ро­вания, но не слиш­ком хо­ро­шо с точ­ки зрения поль­зо­ва­те­ля. Ес­ли при­ло­жению нуж­но мно­го вре­мени на под­клю­чение к сер­ве­ру, оно за­тормозит. В луч­шем слу­чае это про­сто нервирует поль­зо­ва­те­ля; в худ­шем, ес­ли при­ло­жение бу­дет молчать достаточно дол­го, поль­зо­ва­тель мо­жет не до­ж­даться своего счастья и при­ну­ди­тель­но за­крыть при­ло­жение. Что­бы обой­ти эту про­бле­му, нам нуж­на дру­гая нить для вы­полнения опе­ра­ций по ра­бо­те с ба­зой дан­ных. Го­во­ря о нитях, важ­но помнить, что все опе­ра­ции с гра­фи­че­­ским ин­тер­фей­сом долж­ны вы­пол­нять­ся толь­ко в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са, так как ин­ст­ру­мен­та­рий поль­зо­ва­тель­ско­го ин­тер­фей­са Android не яв­ля­ет­ся thread-safe (то есть не га­ран­ти­ру­ет безо­пас­ной ра­бо­ты при од­но­вре­мен­ном вы­полнении в несколь­ких нитях). И вся ра­бо­та с ко­дом ин­ст­ру­мен­та­рия долж­на про­из­во­дить­ся в «глав­ной» нити поль­зо­ва­тель­ско­го ин­тер­фей­са, и лю­бые из­менения в гра­фи­че­­ском ин­тер­фей­се (на­при­мер, по­втор­ное за­полнение спи­ска по­сле син­хрониза­ции с ба­зой дан­ных) долж­ны вы­пол­нять­ся в глав­ной нити, а не в на­шей вто­рой нити.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Файл: LXF160.code_android.r_opt1.jpeg|left |400px |thumb|&amp;gt; Не ос­тав­ляй­те сво­их поль­зо­ва­те­лей во мра­ке — при­ят­ный ин­ди­ка­тор вы­пол­не­ния про­цес­са со­об­щит им, что де­ла­ет при­ло­же­ние.]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В нашем при­ло­жении вся ра­бо­та с ба­зой дан­ных бу­дет осу­ще­ст­в­лять­ся во вто­рой нити, а за­тем мы вернем­ся в пер­вую нить для об­нов­ления спи­ска за­даний. Са­мый про­стой ва­ри­ант здесь – восполь­зо­вать­ся клас­сом AsyncTask, пред­на­зна­чен­ным для уп­ро­щения по­доб­ной ра­бо­ты с нитя­ми. Что­бы восполь­зо­вать­ся AsyncTask, нуж­но соз­дать класс, унас­ле­до­ван­ный от него. Мож­но бы­ло бы соз­дать внут­ренний класс в RemoteTodoSync, но это оз­на­ча­ло бы пе­ре­да­чу вы­полнения нити из глав­но­го клас­са ToDo в RemoteTodoSync, что в свою оче­редь пре­рва­ло бы взаи­мо­дей­ст­вие с поль­зо­ва­те­лем. Мы оста­вим RemoteTodoSync и соз­да­дим ча­ст­ный внут­ренний класс в ToDo.java, пе­ре­мес­тив все при­ват­ные ме­то­ды RemoteTodoSync, ко­то­рые и де­ла­ют всю ра­бо­ту, в этот класс:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В нашем при­ло­жении вся ра­бо­та с ба­зой дан­ных бу­дет осу­ще­ст­в­лять­ся во вто­рой нити, а за­тем мы вернем­ся в пер­вую нить для об­нов­ления спи­ска за­даний. Са­мый про­стой ва­ри­ант здесь – восполь­зо­вать­ся клас­сом AsyncTask, пред­на­зна­чен­ным для уп­ро­щения по­доб­ной ра­бо­ты с нитя­ми. Что­бы восполь­зо­вать­ся AsyncTask, нуж­но соз­дать класс, унас­ле­до­ван­ный от него. Мож­но бы­ло бы соз­дать внут­ренний класс в RemoteTodoSync, но это оз­на­ча­ло бы пе­ре­да­чу вы­полнения нити из глав­но­го клас­са ToDo в RemoteTodoSync, что в свою оче­редь пре­рва­ло бы взаи­мо­дей­ст­вие с поль­зо­ва­те­лем. Мы оста­вим RemoteTodoSync и соз­да­дим ча­ст­ный внут­ренний класс в ToDo.java, пе­ре­мес­тив все при­ват­ные ме­то­ды RemoteTodoSync, ко­то­рые и де­ла­ют всю ра­бо­ту, в этот класс:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 330:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 328:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Те­перь все взаи­мо­дей­ст­вие с сер­ве­ром осу­ще­ст­в­ля­ет­ся в от­дель­ной нити, а при­ло­жение мо­жет со­сре­до­то­чить­ся на взаи­мо­дей­ст­вии с поль­зо­ва­те­лем.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Те­перь все взаи­мо­дей­ст­вие с сер­ве­ром осу­ще­ст­в­ля­ет­ся в от­дель­ной нити, а при­ло­жение мо­жет со­сре­до­то­чить­ся на взаи­мо­дей­ст­вии с поль­зо­ва­те­лем.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Файл: LXF160.code_android.r_opt1.jpeg|left |400px |thumb|&amp;gt; Не ос­тав­ляй­те сво­их поль­зо­ва­те­лей во мра­ке — при­ят­ный ин­ди­ка­тор вы­пол­не­ния про­цес­са со­об­щит им, что де­ла­ет при­ло­же­ние.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;==Ин­ди­ка­тор вы­полнения про­цес­са==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;У вас мо­жет возник­нуть же­лание со­об­щать поль­зо­ва­те­лю о том, что при­ло­жение де­ла­ет в фо­но­вом ре­жи­ме. В AsyncTask есть удоб­ный ме­тод для от­прав­ки ин­фор­ма­ции о хо­де про­цес­са об­рат­но в глав­ную нить – onProgressUpdate(). Что­бы им восполь­зо­вать­ся, сна­ча­ла нуж­но убе­дить­ся, что вто­рой ар­гу­мент шаб­лон­но­го ти­па AsyncTask был за­дан вер­но. Мы восполь­зу­ем­ся CharSequence для ото­бра­жения в окне хо­да вы­полнения про­цес­са. Ме­тод onProgressUpdate() вы­гля­дит так:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;private final ProgressDialog dialog = new&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ProgressDialog(ToDo.this);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;@Override protected void onProgressUpdate(CharSequence... message) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;dialog.setMessage(message[0]);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;dialog.show();&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Что­бы восполь­зо­вать­ся этим, до­бавь­те в лю­бом мес­те клас­са, где долж­но поя­вить­ся со­об­щение, вы­зов publishProgress&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;(“со­об­щение”);. Диа­лог так­же нуж­но бу­дет за­крыть ме­то­дом dialog.dismiss() в onPostExecute().&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Од­на­ко при за­пуске этой вер­сии вы за­ме­ти­те од­ну про­бле­му, свя­зан­ную с этим ок­ном: оно бу­дет ме­шать за­да­че пол­но­стью ра­бо­тать в фоне, так как фо­кус пе­рей­дет на ок­но со­об­щения. Это мо­жет быть удоб­но, ес­ли вы не хо­ти­те, что­бы поль­зо­ва­те­ли ра­бо­та­ли с при­ло­жением при вы­полнении за­да­чи в фоне – так они ви­дят, что при­ло­жение не за­вис­ло.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Ес­ли вы хо­ти­те, что­бы поль­зо­ва­те­ли мог­ли ра­бо­тать с при­ло­жением, есть дру­гой ва­ри­ант – по­ка­зать ин­ди­ка­тор вы­полнения про­цес­са в за­го­лов­ке ок­на. Это про­сто. Для на­ча­ла до­бавь­те эту стро­ку в ме­тод onCreate() в ToDo.java (пе­ред вы­зо­вом setContentView):&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;setContentView(R.layout.main);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;По­лу­чи­те на­строй­ки диа­ло­го­во­го ок­на в SyncDataTask и до­бавь­те в onPreExecute() стро­ку&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ToDo.this.setProgressBarIndeterminateVisibility(true);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;а в onPostExecute() – стро­ку&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ToDo.this.setProgressBarIndeterminateVisibility(false);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;(здесь не ис­поль­зу­ет­ся ме­тод onProgressUpdate(), так как мы не об­нов­ля­ем ин­фор­ма­цию о хо­де вы­полнения про­цес­са, а про­сто по­ка­зы­ва­ем, что де­ла идут). Го­то­во. Ском­пи­ли­руй­те и за­пусти­те про­грам­му, и вы уви­ди­те ин­ди­ка­тор вы­полнения про­цес­са в пра­вом верхнем уг­лу. Сле­дую­щее, о чем нуж­но по­ду­мать, ес­ли вы хо­ти­те про­дол­жить раз­ра­бот­ку при­ло­жения – что про­изой­дет, ес­ли дей­ст­вие бу­дет за­вер­ше­но или пе­ре­за­пу­ще­но в про­цес­се вы­полнения? Это осо­бен­но ак­ту­аль­но с AsyncTask, так как те­перь у нас несколь­ко нитей. |&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Ин­ди­ка­тор вы­полнения про­цес­са===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Ин­ди­ка­тор вы­полнения про­цес­са===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18223&amp;oldid=prev</id>
		<title>Olkol: /* Асин­хрон­ные за­да­чи */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18223&amp;oldid=prev"/>
				<updated>2018-09-29T07:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Асин­хрон­ные за­да­чи&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:55, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы де­ла­ем здесь, вы­пол­ня­ет­ся в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са Дей­ст­вия. Это неслож­но с точ­ки зрения про­грам­ми­ро­вания, но не слиш­ком хо­ро­шо с точ­ки зрения поль­зо­ва­те­ля. Ес­ли при­ло­жению нуж­но мно­го вре­мени на под­клю­чение к сер­ве­ру, оно за­тормозит. В луч­шем слу­чае это про­сто нервирует поль­зо­ва­те­ля; в худ­шем, ес­ли при­ло­жение бу­дет молчать достаточно дол­го, поль­зо­ва­тель мо­жет не до­ж­даться своего счастья и при­ну­ди­тель­но за­крыть при­ло­жение. Что­бы обой­ти эту про­бле­му, нам нуж­на дру­гая нить для вы­полнения опе­ра­ций по ра­бо­те с ба­зой дан­ных. Го­во­ря о нитях, важ­но помнить, что все опе­ра­ции с гра­фи­че­­ским ин­тер­фей­сом долж­ны вы­пол­нять­ся толь­ко в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са, так как ин­ст­ру­мен­та­рий поль­зо­ва­тель­ско­го ин­тер­фей­са Android не яв­ля­ет­ся thread-safe (то есть не га­ран­ти­ру­ет безо­пас­ной ра­бо­ты при од­но­вре­мен­ном вы­полнении в несколь­ких нитях). И вся ра­бо­та с ко­дом ин­ст­ру­мен­та­рия долж­на про­из­во­дить­ся в «глав­ной» нити поль­зо­ва­тель­ско­го ин­тер­фей­са, и лю­бые из­менения в гра­фи­че­­ском ин­тер­фей­се (на­при­мер, по­втор­ное за­полнение спи­ска по­сле син­хрониза­ции с ба­зой дан­ных) долж­ны вы­пол­нять­ся в глав­ной нити, а не в на­шей вто­рой нити.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы де­ла­ем здесь, вы­пол­ня­ет­ся в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са Дей­ст­вия. Это неслож­но с точ­ки зрения про­грам­ми­ро­вания, но не слиш­ком хо­ро­шо с точ­ки зрения поль­зо­ва­те­ля. Ес­ли при­ло­жению нуж­но мно­го вре­мени на под­клю­чение к сер­ве­ру, оно за­тормозит. В луч­шем слу­чае это про­сто нервирует поль­зо­ва­те­ля; в худ­шем, ес­ли при­ло­жение бу­дет молчать достаточно дол­го, поль­зо­ва­тель мо­жет не до­ж­даться своего счастья и при­ну­ди­тель­но за­крыть при­ло­жение. Что­бы обой­ти эту про­бле­му, нам нуж­на дру­гая нить для вы­полнения опе­ра­ций по ра­бо­те с ба­зой дан­ных. Го­во­ря о нитях, важ­но помнить, что все опе­ра­ции с гра­фи­че­­ским ин­тер­фей­сом долж­ны вы­пол­нять­ся толь­ко в глав­ной нити поль­зо­ва­тель­ско­го ин­тер­фей­са, так как ин­ст­ру­мен­та­рий поль­зо­ва­тель­ско­го ин­тер­фей­са Android не яв­ля­ет­ся thread-safe (то есть не га­ран­ти­ру­ет безо­пас­ной ра­бо­ты при од­но­вре­мен­ном вы­полнении в несколь­ких нитях). И вся ра­бо­та с ко­дом ин­ст­ру­мен­та­рия долж­на про­из­во­дить­ся в «глав­ной» нити поль­зо­ва­тель­ско­го ин­тер­фей­са, и лю­бые из­менения в гра­фи­че­­ском ин­тер­фей­се (на­при­мер, по­втор­ное за­полнение спи­ска по­сле син­хрониза­ции с ба­зой дан­ных) долж­ны вы­пол­нять­ся в глав­ной нити, а не в на­шей вто­рой нити.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Файл: LXF160.code_android.r_opt1.jpeg|left |400px |thumb|&amp;gt; Не ос­тав­ляй­те сво­их поль­зо­ва­те­лей во мра­ке — при­ят­ный ин­ди­ка­тор вы­пол­не­ния про­цес­са со­об­щит им, что де­ла­ет при­ло­же­ние.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В нашем при­ло­жении вся ра­бо­та с ба­зой дан­ных бу­дет осу­ще­ст­в­лять­ся во вто­рой нити, а за­тем мы вернем­ся в пер­вую нить для об­нов­ления спи­ска за­даний. Са­мый про­стой ва­ри­ант здесь – восполь­зо­вать­ся клас­сом AsyncTask, пред­на­зна­чен­ным для уп­ро­щения по­доб­ной ра­бо­ты с нитя­ми. Что­бы восполь­зо­вать­ся AsyncTask, нуж­но соз­дать класс, унас­ле­до­ван­ный от него. Мож­но бы­ло бы соз­дать внут­ренний класс в RemoteTodoSync, но это оз­на­ча­ло бы пе­ре­да­чу вы­полнения нити из глав­но­го клас­са ToDo в RemoteTodoSync, что в свою оче­редь пре­рва­ло бы взаи­мо­дей­ст­вие с поль­зо­ва­те­лем. Мы оста­вим RemoteTodoSync и соз­да­дим ча­ст­ный внут­ренний класс в ToDo.java, пе­ре­мес­тив все при­ват­ные ме­то­ды RemoteTodoSync, ко­то­рые и де­ла­ют всю ра­бо­ту, в этот класс:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В нашем при­ло­жении вся ра­бо­та с ба­зой дан­ных бу­дет осу­ще­ст­в­лять­ся во вто­рой нити, а за­тем мы вернем­ся в пер­вую нить для об­нов­ления спи­ска за­даний. Са­мый про­стой ва­ри­ант здесь – восполь­зо­вать­ся клас­сом AsyncTask, пред­на­зна­чен­ным для уп­ро­щения по­доб­ной ра­бо­ты с нитя­ми. Что­бы восполь­зо­вать­ся AsyncTask, нуж­но соз­дать класс, унас­ле­до­ван­ный от него. Мож­но бы­ло бы соз­дать внут­ренний класс в RemoteTodoSync, но это оз­на­ча­ло бы пе­ре­да­чу вы­полнения нити из глав­но­го клас­са ToDo в RemoteTodoSync, что в свою оче­редь пре­рва­ло бы взаи­мо­дей­ст­вие с поль­зо­ва­те­лем. Мы оста­вим RemoteTodoSync и соз­да­дим ча­ст­ный внут­ренний класс в ToDo.java, пе­ре­мес­тив все при­ват­ные ме­то­ды RemoteTodoSync, ко­то­рые и де­ла­ют всю ра­бо­ту, в этот класс:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18221&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с по­лу­чен­ны­ми дан­ны­ми */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18221&amp;oldid=prev"/>
				<updated>2018-09-29T06:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с по­лу­чен­ны­ми дан­ны­ми&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;amp;diff=18221&amp;amp;oldid=18220&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18220&amp;oldid=prev</id>
		<title>Olkol: /* Раз­бор JSON */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18220&amp;oldid=prev"/>
				<updated>2018-09-29T06:25:00Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Раз­бор JSON&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 06:25, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 90:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 90:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;switch (requestCode) {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;switch (requestCode) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл:LXF160.code_android.rd_opt.jpeg |&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;left &lt;/del&gt;|300px |thumb|&amp;gt; При­ло­же­ние на ре­аль­ном уст­рой­ст­ве.]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл:LXF160.code_android.rd_opt.jpeg |&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;right&lt;/ins&gt;|300px |thumb|&amp;gt; При­ло­же­ние на ре­аль­ном уст­рой­ст­ве.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;case SERVER_UPDATE_ID:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;case SERVER_UPDATE_ID:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18218&amp;oldid=prev</id>
		<title>Olkol в 06:24, 29 сентября 2018</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18218&amp;oldid=prev"/>
				<updated>2018-09-29T06:24:07Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 06:24, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Android]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Android]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''» Про­грам­ми­ро­ва­ние С базами данных Android умеет работать и в облаках'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''» Про­грам­ми­ро­ва­ние&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;. &lt;/ins&gt;С базами данных Android умеет работать и в облаках'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Android:Ба­зы дан­ных в об­ла­ке==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Android:Ба­зы дан­ных в об­ла­ке==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В про­шлом ме­ся­це мы ра­бо­та­ли с локаль­ной ба­зой дан­ных Android. Ну, а ес­ли нуж­но свя­зать­ся с уда­лен­ной ба­зой дан­ных? Есть несколь­ко спо­со­бов это сде­лать, но на на­шем уро­ке мы рас­смот­рим ва­ри­ант, при ко­то­ром для об­щения с ба­зой дан­ных ис­поль­зу­ют­ся HTTP-за­про­сы – это, по­жа­луй, са­мый про­стой спо­соб. Этот ва­ри­ант так­же яв­ля­ет­ся рас­ши­ряе­мым: мы по­лу­ча­ем ин­фор­ма­цию из ба­зы дан­ных, но с по­мо­щью тех же ме­то­дов и API мож­но по­лу­чить все, что го­тов пре­доста­вить web-сер­вер. Мы бу­дем об­ра­ба­ты­вать дан­ные с по­мо­щью JSON и по­смот­рим, как де­лать это в фоне, что­бы основ­ное при­ло­жение не за­ви­са­ло при ожи­дании под­клю­чения от сер­ве­ра.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В про­шлом ме­ся­це мы ра­бо­та­ли с локаль­ной ба­зой дан­ных Android. Ну, а ес­ли нуж­но свя­зать­ся с уда­лен­ной ба­зой дан­ных? Есть несколь­ко спо­со­бов это сде­лать, но на на­шем уро­ке мы рас­смот­рим ва­ри­ант, при ко­то­ром для об­щения с ба­зой дан­ных ис­поль­зу­ют­ся HTTP-за­про­сы – это, по­жа­луй, са­мый про­стой спо­соб. Этот ва­ри­ант так­же яв­ля­ет­ся рас­ши­ряе­мым: мы по­лу­ча­ем ин­фор­ма­цию из ба­зы дан­ных, но с по­мо­щью тех же ме­то­дов и API мож­но по­лу­чить все, что го­тов пре­доста­вить web-сер­вер. Мы бу­дем об­ра­ба­ты­вать дан­ные с по­мо­щью JSON и по­смот­рим, как де­лать это в фоне, что­бы основ­ное при­ло­жение не за­ви­са­ло при ожи­дании под­клю­чения от сер­ве­ра.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот код осно­ван на ко­де для ра­бо­ты с локаль­ной ба­зой дан­ных из пре­ды­ду­щей ста­тьи; ес­ли вы ее не чи­та­ли, возь­ми­те пол­ный код при­ло­жения с на­ше­го дис­ка.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот код осно­ван на ко­де для ра­бо­ты с локаль­ной ба­зой дан­ных из пре­ды­ду­щей ста­тьи; ес­ли вы ее не чи­та­ли, возь­ми­те пол­ный код при­ло­жения с на­ше­го дис­ка.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ба­зо­вый за­прос HTTP&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;Ба­зо­вый за­прос HTTP&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пре­ж­де чем на­чать пи­сать код HTTP-за­про­са, при­ло­же­нию нуж­но пре­дос­та­вить пра­ва дос­ту­па к се­ти. До­бавь­те в ма­ни­фест стро­ку&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пре­ж­де чем на­чать пи­сать код HTTP-за­про­са, при­ло­же­нию нуж­но пре­дос­та­вить пра­ва дос­ту­па к се­ти. До­бавь­те в ма­ни­фест стро­ку&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 26:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 23:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для вы­полнения HTTP-за­про­са су­ще­ст­ву­ет два ва­ри­ан­та API: HTTPClient и HttpURLConnection. На­чи­ная с Android 2.3, Google со­ве­ту­ет ис­поль­зо­вать HttpURLConnection, но на прак­ти­ке мно­гие еще пред­по­чи­та­ют HTTPClient, и с ним лег­че по­лу­чить со­ве­ты или по­мощь. Что­бы про­де­мон­ст­ри­ро­вать оба клас­са в дей­ст­вии, я восполь­зу­юсь HTTPClient для на­пи­сания про­сто­го ме­то­да по­лу­чения дан­ных с сер­ве­ра, а HttpURLConnection — для про­сто­го ме­то­да от­прав­ки дан­ных на сер­вер.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для вы­полнения HTTP-за­про­са су­ще­ст­ву­ет два ва­ри­ан­та API: HTTPClient и HttpURLConnection. На­чи­ная с Android 2.3, Google со­ве­ту­ет ис­поль­зо­вать HttpURLConnection, но на прак­ти­ке мно­гие еще пред­по­чи­та­ют HTTPClient, и с ним лег­че по­лу­чить со­ве­ты или по­мощь. Что­бы про­де­мон­ст­ри­ро­вать оба клас­са в дей­ст­вии, я восполь­зу­юсь HTTPClient для на­пи­сания про­сто­го ме­то­да по­лу­чения дан­ных с сер­ве­ра, а HttpURLConnection — для про­сто­го ме­то­да от­прав­ки дан­ных на сер­вер.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Раз­бор JSON&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;Раз­бор JSON&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для от­прав­ки дан­ных ту­да и об­рат­но вам по­на­до­бит­ся фор­мат хранения дан­ных, ко­то­рый смо­гут по­нять и те­ле­фон, и web-сер­вер. Хо­ро­ший ва­ри­ант, ко­то­рым мы здесь и восполь­зу­ем­ся – JSON, со­кра­щение от “JavaScript Object Notation [Фор­мат опи­сания объ­ек­тов JavaScript]”. Это лег­кий фор­мат об­ме­на дан­ны­ми, ко­то­рый по­ня­тен и для чтения/за­пи­си че­ло­ве­ку, и для раз­бо­ра/генера­ции ком­пь­ю­те­ру. Су­ще­ст­ву­ет мно­же­ст­во дру­гих фор­ма­тов об­ме­на дан­ны­ми, но JSON – хо­ро­ший ба­зо­вый фор­мат для стро­ко­вых дан­ных, ко­то­рые и хранятся в на­шей ба­зе.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для от­прав­ки дан­ных ту­да и об­рат­но вам по­на­до­бит­ся фор­мат хранения дан­ных, ко­то­рый смо­гут по­нять и те­ле­фон, и web-сер­вер. Хо­ро­ший ва­ри­ант, ко­то­рым мы здесь и восполь­зу­ем­ся – JSON, со­кра­щение от “JavaScript Object Notation [Фор­мат опи­сания объ­ек­тов JavaScript]”. Это лег­кий фор­мат об­ме­на дан­ны­ми, ко­то­рый по­ня­тен и для чтения/за­пи­си че­ло­ве­ку, и для раз­бо­ра/генера­ции ком­пь­ю­те­ру. Су­ще­ст­ву­ет мно­же­ст­во дру­гих фор­ма­тов об­ме­на дан­ны­ми, но JSON – хо­ро­ший ба­зо­вый фор­мат для стро­ко­вых дан­ных, ко­то­рые и хранятся в на­шей ба­зе.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 93:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 90:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;switch (requestCode) {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;switch (requestCode) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[Файл:LXF160.code_android.rd_opt.jpeg |left |300px |thumb|&amp;gt; При­ло­же­ние на ре­аль­ном уст­рой­ст­ве.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;case SERVER_UPDATE_ID:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;case SERVER_UPDATE_ID:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 218:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 215:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Сер­вер вернет од­ну стро­ку для все­го мас­си­ва (хо­тя ес­ли он вернет несколь­ко строк, наш код сумеет справиться с их об­ра­бо­ткой), ко­то­рую мы раз­би­ра­ем сна­ча­ла в от­дель­ные объ­ек­ты JSONObject, а за­тем в необ­хо­ди­мые ком­понен­ты. Опять же, воз­вра­ща­ет­ся стро­ка, ко­то­рая пре­об­ра­зу­ет­ся в JSONArray – это уп­ро­ща­ет раз­бор.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Сер­вер вернет од­ну стро­ку для все­го мас­си­ва (хо­тя ес­ли он вернет несколь­ко строк, наш код сумеет справиться с их об­ра­бо­ткой), ко­то­рую мы раз­би­ра­ем сна­ча­ла в от­дель­ные объ­ек­ты JSONObject, а за­тем в необ­хо­ди­мые ком­понен­ты. Опять же, воз­вра­ща­ет­ся стро­ка, ко­то­рая пре­об­ра­зу­ет­ся в JSONArray – это уп­ро­ща­ет раз­бор.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ра­бо­та с по­лу­чен­ны­ми дан­ны­ми&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;Ра­бо­та с по­лу­чен­ны­ми дан­ны­ми&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конеч­но, в том что­бы про­сто вы­вес­ти дан­ные в лог-файл, про­ку ма­ло. Нам нуж­на ка­кая-то фор­ма син­хрониза­ции с ба­зой дан­ных Android. На этом уро­ке я не бу­ду го­во­рить о син­хрониза­ции (это до­воль­но слож­ная те­ма – ло­ги­ка ее ра­бо­ты и про­бле­мы, ко­то­рые нуж­но об­су­дить, за­ня­ли бы боль­шую часть ста­тьи). Вме­сто это­го мы вы­полним про­стую про­вер­ку на дуб­ли­ка­ты и за­тем ско­пи­ру­ем дан­ные с сер­ве­ра на уст­рой­ст­во Android. В сле­дую­щем раз­де­ле мы зай­мем­ся от­прав­кой дан­ных с уст­рой­ст­ва Android на сер­вер, но по тем же при­чи­нам эко­но­мии мес­та и внимания мы не бу­дем ка­сать­ся сер­вер­но­го ко­да, необ­хо­ди­мо­го для их сбро­са в MySQL на сто­роне сер­ве­ра.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конеч­но, в том что­бы про­сто вы­вес­ти дан­ные в лог-файл, про­ку ма­ло. Нам нуж­на ка­кая-то фор­ма син­хрониза­ции с ба­зой дан­ных Android. На этом уро­ке я не бу­ду го­во­рить о син­хрониза­ции (это до­воль­но слож­ная те­ма – ло­ги­ка ее ра­бо­ты и про­бле­мы, ко­то­рые нуж­но об­су­дить, за­ня­ли бы боль­шую часть ста­тьи). Вме­сто это­го мы вы­полним про­стую про­вер­ку на дуб­ли­ка­ты и за­тем ско­пи­ру­ем дан­ные с сер­ве­ра на уст­рой­ст­во Android. В сле­дую­щем раз­де­ле мы зай­мем­ся от­прав­кой дан­ных с уст­рой­ст­ва Android на сер­вер, но по тем же при­чи­нам эко­но­мии мес­та и внимания мы не бу­дем ка­сать­ся сер­вер­но­го ко­да, необ­хо­ди­мо­го для их сбро­са в MySQL на сто­роне сер­ве­ра.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18217&amp;oldid=prev</id>
		<title>Olkol в 06:17, 29 сентября 2018</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18217&amp;oldid=prev"/>
				<updated>2018-09-29T06:17:37Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 06:17, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: LXF160.code_android.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;r_expert.jpeg&lt;/del&gt;.png|100px|left ]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: LXF160.code_android.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;expert&lt;/ins&gt;.png|100px|left ]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18215&amp;oldid=prev</id>
		<title>Olkol в 06:13, 29 сентября 2018</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18215&amp;oldid=prev"/>
				<updated>2018-09-29T06:13:22Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 06:13, 29 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;LXF111&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;tut_adv&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;jkemp&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;psd&lt;/del&gt;|left ]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Файл: &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;LXF160&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;code_android&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;r_expert&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;jpeg.png|100px&lt;/ins&gt;|left ]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18214&amp;oldid=prev</id>
		<title>Olkol: Новая страница: «Категория:Постояные рубрики [[Категория:Android]  '''» Про­грам­ми­ро­ва­ние С базами данн…»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF160:Android-%D0%BF%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=18214&amp;oldid=prev"/>
				<updated>2018-09-29T06:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D1%8B%D0%B5_%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Постояные рубрики (страница не существует)&quot;&gt;Категория:Постояные рубрики&lt;/a&gt; [[Категория:Android]  &amp;#039;&amp;#039;&amp;#039;» Про­грам­ми­ро­ва­ние С базами данн…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:Постояные рубрики]]&lt;br /&gt;
[[Категория:Android]&lt;br /&gt;
&lt;br /&gt;
'''» Про­грам­ми­ро­ва­ние С базами данных Android умеет работать и в облаках'''&lt;br /&gt;
&lt;br /&gt;
==Android:Ба­зы дан­ных в об­ла­ке==&lt;br /&gt;
''Джуль­ет­та Кемп по­ка­зы­ва­ет, как под­клю­чить­ся к об­ла­ку и за­ста­вить свое при­ло­жение взаи­мо­дей­ст­во­вать с сер­ве­ром.&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
[[Файл: LXF111.tut_adv.jkemp.psd|left ]]&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|Заголовок=Наш эксперт |Ширина=20%|Содержание= ''Джуль­ет­та Кемп – пи­са­тель-фри­лан­сер; сей­час она ду­ма­ет над тем, что еще ей уда­ст­ся сде­лать с по­мо­щью HTTP-под­клю­че­ния сво­его те­ле­фо­на к сер­ве­ру.''}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В про­шлом ме­ся­це мы ра­бо­та­ли с локаль­ной ба­зой дан­ных Android. Ну, а ес­ли нуж­но свя­зать­ся с уда­лен­ной ба­зой дан­ных? Есть несколь­ко спо­со­бов это сде­лать, но на на­шем уро­ке мы рас­смот­рим ва­ри­ант, при ко­то­ром для об­щения с ба­зой дан­ных ис­поль­зу­ют­ся HTTP-за­про­сы – это, по­жа­луй, са­мый про­стой спо­соб. Этот ва­ри­ант так­же яв­ля­ет­ся рас­ши­ряе­мым: мы по­лу­ча­ем ин­фор­ма­цию из ба­зы дан­ных, но с по­мо­щью тех же ме­то­дов и API мож­но по­лу­чить все, что го­тов пре­доста­вить web-сер­вер. Мы бу­дем об­ра­ба­ты­вать дан­ные с по­мо­щью JSON и по­смот­рим, как де­лать это в фоне, что­бы основ­ное при­ло­жение не за­ви­са­ло при ожи­дании под­клю­чения от сер­ве­ра.&lt;br /&gt;
&lt;br /&gt;
Этот код осно­ван на ко­де для ра­бо­ты с локаль­ной ба­зой дан­ных из пре­ды­ду­щей ста­тьи; ес­ли вы ее не чи­та­ли, возь­ми­те пол­ный код при­ло­жения с на­ше­го дис­ка.&lt;br /&gt;
&lt;br /&gt;
Ба­зо­вый за­прос HTTP&lt;br /&gt;
&lt;br /&gt;
Пре­ж­де чем на­чать пи­сать код HTTP-за­про­са, при­ло­же­нию нуж­но пре­дос­та­вить пра­ва дос­ту­па к се­ти. До­бавь­те в ма­ни­фест стро­ку&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uses-permission android:name=”android.permission.INTERNET” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вы­полнения HTTP-за­про­са су­ще­ст­ву­ет два ва­ри­ан­та API: HTTPClient и HttpURLConnection. На­чи­ная с Android 2.3, Google со­ве­ту­ет ис­поль­зо­вать HttpURLConnection, но на прак­ти­ке мно­гие еще пред­по­чи­та­ют HTTPClient, и с ним лег­че по­лу­чить со­ве­ты или по­мощь. Что­бы про­де­мон­ст­ри­ро­вать оба клас­са в дей­ст­вии, я восполь­зу­юсь HTTPClient для на­пи­сания про­сто­го ме­то­да по­лу­чения дан­ных с сер­ве­ра, а HttpURLConnection — для про­сто­го ме­то­да от­прав­ки дан­ных на сер­вер.&lt;br /&gt;
&lt;br /&gt;
Раз­бор JSON&lt;br /&gt;
&lt;br /&gt;
Для от­прав­ки дан­ных ту­да и об­рат­но вам по­на­до­бит­ся фор­мат хранения дан­ных, ко­то­рый смо­гут по­нять и те­ле­фон, и web-сер­вер. Хо­ро­ший ва­ри­ант, ко­то­рым мы здесь и восполь­зу­ем­ся – JSON, со­кра­щение от “JavaScript Object Notation [Фор­мат опи­сания объ­ек­тов JavaScript]”. Это лег­кий фор­мат об­ме­на дан­ны­ми, ко­то­рый по­ня­тен и для чтения/за­пи­си че­ло­ве­ку, и для раз­бо­ра/генера­ции ком­пь­ю­те­ру. Су­ще­ст­ву­ет мно­же­ст­во дру­гих фор­ма­тов об­ме­на дан­ны­ми, но JSON – хо­ро­ший ба­зо­вый фор­мат для стро­ко­вых дан­ных, ко­то­рые и хранятся в на­шей ба­зе.&lt;br /&gt;
&lt;br /&gt;
Один JSONObject бу­дет на­по­ми­нать опи­сание од­но­го из за­даний из таб­ли­цы за­даний при­ло­жения ToDo:&lt;br /&gt;
&lt;br /&gt;
{“_id”:1,”task”:”test task”, “duedate”:”2011-12-24”, “createdate”:1324660453756, “category_link”:2}&lt;br /&gt;
&lt;br /&gt;
П­режде чем вступать во взаи­мо­дей­ст­ви­е с на­стоя­щим сер­ве­ром MySQL, рассмотрим про­стой при­ме­р на PHP, ко­то­рый воспро­из­во­дит эту стро­ку вруч­ную:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$output=array(&lt;br /&gt;
&lt;br /&gt;
“_id” =&amp;gt; 1,&lt;br /&gt;
&lt;br /&gt;
“category” =&amp;gt; ‘work’&lt;br /&gt;
&lt;br /&gt;
); print(json_encode($output));&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Со­храните этот код на сер­ве­ре в фай­ле test.php, и те­перь он го­тов от­ве­тить на за­прос ва­ше­го те­ле­фо­на. За­тем соз­дай­те но­вый класс Android в сво­ем про­ек­те RemoteTodoSync.java:&lt;br /&gt;
&lt;br /&gt;
public class RemoteTodoSync extends Activity {&lt;br /&gt;
&lt;br /&gt;
public static final String WEBADDRESS = “http://yourserver/test.php”;&lt;br /&gt;
&lt;br /&gt;
private static final String TAG = “RemoteTodoSync”;&lt;br /&gt;
&lt;br /&gt;
public void onCreate(Bundle savedInstanceState)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
super.onCreate(savedInstanceState);&lt;br /&gt;
&lt;br /&gt;
retrieveData();&lt;br /&gt;
&lt;br /&gt;
Intent i = new Intent();&lt;br /&gt;
&lt;br /&gt;
setResult(RESULT_OK, i);&lt;br /&gt;
&lt;br /&gt;
finish();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
До­бавь­те его в AndroidManifest.xml, за­тем до­бавь­те та­кие стро­ки в ToDo.java для вы­зо­ва Дей­ст­вия и об­ра­бот­ки ре­зуль­та­та:&lt;br /&gt;
&lt;br /&gt;
public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
startActivityForResult(new Intent(this.getBaseContext(),&lt;br /&gt;
&lt;br /&gt;
RemoteTodoSync.class), SERVER_UPDATE_ID);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override protected void onActivityResult(int requestCode, int resultCode, Intent i) {&lt;br /&gt;
&lt;br /&gt;
super.onActivityResult(requestCode, resultCode, i);&lt;br /&gt;
&lt;br /&gt;
switch (requestCode) {&lt;br /&gt;
&lt;br /&gt;
case SERVER_UPDATE_ID:&lt;br /&gt;
&lt;br /&gt;
populateList();&lt;br /&gt;
&lt;br /&gt;
default:&lt;br /&gt;
&lt;br /&gt;
// do nothing; no other result expected&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Ме­тод retrieveData() клас­са RemoteTodoSync по­лу­чит на­шу тес­то­вую стро­ку (пред­став­ляю­щую объ­ект JSONObject) из фай­ла test.php:&lt;br /&gt;
&lt;br /&gt;
private void retrieveData() {&lt;br /&gt;
&lt;br /&gt;
InputStream is = null;&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
HttpClient httpClient = new DefaultHttpClient();&lt;br /&gt;
&lt;br /&gt;
HttpPost httpPost = new HttpPost(WEBADDRESS);&lt;br /&gt;
&lt;br /&gt;
HttpResponse response = httpClient.execute(httpPost);&lt;br /&gt;
&lt;br /&gt;
HttpEntity entity = response.getEntity();&lt;br /&gt;
&lt;br /&gt;
is = entity.getContent();&lt;br /&gt;
&lt;br /&gt;
} catch (IOException e) {&lt;br /&gt;
&lt;br /&gt;
Log.e(TAG, “IOException “ + e.toString());&lt;br /&gt;
&lt;br /&gt;
e.printStackTrace();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
BufferedReader reader = new BufferedReader&lt;br /&gt;
&lt;br /&gt;
(new InputStreamReader(is, “iso-8859-1”), 8);&lt;br /&gt;
&lt;br /&gt;
String line = null;&lt;br /&gt;
&lt;br /&gt;
while ((line = reader.readLine()) != null) {&lt;br /&gt;
&lt;br /&gt;
JSONObject jo = new JSONObject(line);&lt;br /&gt;
&lt;br /&gt;
Log.v(TAG, “id is: “ + jo.getInt(TodoDatabaseProvider.ID));&lt;br /&gt;
&lt;br /&gt;
Log.v(TAG, “task is: “ + jo.getString(TodoDatabaseProvider.TASK));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
is.close();&lt;br /&gt;
&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
&lt;br /&gt;
Log.e(TAG, “Exception: “ + e.toString());&lt;br /&gt;
&lt;br /&gt;
e.printStackTrace();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
В пер­вом бло­ке try соз­да­ет­ся HttpClient, от­прав­ля­ет­ся за­прос на URL, за­дан­ный в WEBADDRESS, и ре­зуль­тат это­го за­про­са со­хра­ня­ет­ся в InputStream. Во вто­ром бло­ке про­из­во­дит­ся раз­бор это­го ре­зуль­та­та; сей­час ре­зуль­тат про­сто вы­во­дит­ся в лог-файл без до­полнитель­ных дей­ст­вий.&lt;br /&gt;
&lt;br /&gt;
По­смот­рев на код, вы уви­ди­те, что на са­мом де­ле счи­ты­ва­ет­ся стро­ка (String), ко­то­рая за­тем вновь пре­вра­ща­ет­ся в JSONObject. Так ее про­ще ра­зо­брать, по­сколь­ку мож­но восполь­зо­вать­ся ме­то­да­ми раз­бо­ра JSONObject, а не занимать­ся этим вруч­ную. Как ил­лю­ст­ри­ру­ют при­ве­ден­ные здесь при­ме­ры по­лу­чения це­лых чи­сел и строк, ме­то­да­ми getX() из объ­ек­та JSONObject мож­но по­лу­чить зна­чения лю­бых ти­пов.&lt;br /&gt;
&lt;br /&gt;
InputStreamReader пре­об­ра­зу­ет бай­ты вход­но­го по­то­ка (is) в сим­во­лы с по­мо­щью пре­об­ра­зо­ва­те­ля сим­во­лов. BufferedReader бу­фе­ри­зу­ет ре­зуль­тат в груп­пах по во­семь сим­во­лов. С по­мо­щью это­го при­ме­ра мож­но по­смот­реть, что про­ис­хо­дит (и убе­дить­ся, что все клас­сы инициа­ли­зи­ро­ва­ны пра­виль­но). Од­на­ко дан­ные, по­лу­чен­ные от на­стоя­ще­го сер­ве­ра MySQL, бу­дут пред­став­ле­ны в ви­де JSONArray, ко­то­рый тре­бу­ет несколь­ко боль­ше­го раз­бо­ра и вы­гля­дит так (квад­рат­ные скоб­ки ог­раничи­ва­ют мас­сив):&lt;br /&gt;
&lt;br /&gt;
[{“_id”:1,”task”:”test task”, “duedate”:”2011-12-24”, “createdate”:1324660453756, “category_link”:2}&lt;br /&gt;
&lt;br /&gt;
{“_id”:2,”task”:”new work task”, “duedate”:”2011-12-31”, “createdate”:1324661242417, “category_link”:1}]&lt;br /&gt;
&lt;br /&gt;
Вот про­стой при­мер PHP-ко­да для за­пуска на web-сер­ве­ре (об­ра­ти­те внимание, здесь под­ра­зу­ме­ва­ет­ся, что ба­за MySQL уже соз­да­на и за­полнена дан­ны­ми, ина­че ника­ких дан­ных из за­про­са вы не по­лу­чи­те):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php mysql_connect(“host”, “user”, “password”); mysql_select_db(“todo”);&lt;br /&gt;
&lt;br /&gt;
$output;&lt;br /&gt;
&lt;br /&gt;
$q = mysql_query(“select * from tasks”); while($e = mysql_fetch_assoc($q)) {&lt;br /&gt;
&lt;br /&gt;
$output[] = $e;&lt;br /&gt;
&lt;br /&gt;
} print(json_encode($output)); mysql_close();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но­вый улуч­шен­ный ва­ри­ант раз­бо­ра JSON вы­гля­дит так (пер­вый блок try HttpClient ос­тал­ся без из­ме­не­ний):&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
BufferedReader reader = new BufferedReader&lt;br /&gt;
&lt;br /&gt;
(new InputStreamReader(is, “iso-8859-1”), 8);&lt;br /&gt;
&lt;br /&gt;
String line = null;&lt;br /&gt;
&lt;br /&gt;
while ((line = reader.readLine()) != null) {&lt;br /&gt;
&lt;br /&gt;
JSONArray resultArray = new JSONArray(line);&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; resultArray.length(); i++) {&lt;br /&gt;
&lt;br /&gt;
JSONObject jo = (JSONObject) resultArray.get(i);&lt;br /&gt;
&lt;br /&gt;
Log.v(TAG, “id is: “ + jo.getInt(TodoDatabaseProvider.ID);&lt;br /&gt;
&lt;br /&gt;
Log.v(TAG, “task is: “ + jo.getString(TodoDatabaseProvider.TASK));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
is.close();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Сер­вер вернет од­ну стро­ку для все­го мас­си­ва (хо­тя ес­ли он вернет несколь­ко строк, наш код сумеет справиться с их об­ра­бо­ткой), ко­то­рую мы раз­би­ра­ем сна­ча­ла в от­дель­ные объ­ек­ты JSONObject, а за­тем в необ­хо­ди­мые ком­понен­ты. Опять же, воз­вра­ща­ет­ся стро­ка, ко­то­рая пре­об­ра­зу­ет­ся в JSONArray – это уп­ро­ща­ет раз­бор.&lt;br /&gt;
&lt;br /&gt;
Ра­бо­та с по­лу­чен­ны­ми дан­ны­ми&lt;br /&gt;
&lt;br /&gt;
Конеч­но, в том что­бы про­сто вы­вес­ти дан­ные в лог-файл, про­ку ма­ло. Нам нуж­на ка­кая-то фор­ма син­хрониза­ции с ба­зой дан­ных Android. На этом уро­ке я не бу­ду го­во­рить о син­хрониза­ции (это до­воль­но слож­ная те­ма – ло­ги­ка ее ра­бо­ты и про­бле­мы, ко­то­рые нуж­но об­су­дить, за­ня­ли бы боль­шую часть ста­тьи). Вме­сто это­го мы вы­полним про­стую про­вер­ку на дуб­ли­ка­ты и за­тем ско­пи­ру­ем дан­ные с сер­ве­ра на уст­рой­ст­во Android. В сле­дую­щем раз­де­ле мы зай­мем­ся от­прав­кой дан­ных с уст­рой­ст­ва Android на сер­вер, но по тем же при­чи­нам эко­но­мии мес­та и внимания мы не бу­дем ка­сать­ся сер­вер­но­го ко­да, необ­хо­ди­мо­го для их сбро­са в MySQL на сто­роне сер­ве­ра.&lt;br /&gt;
&lt;br /&gt;
При из­менении ко­да локаль­ной ба­зы дан­ных для ра­бо­ты с сер­ве­ром ме­тод retrieveData() во мно­гом останет­ся прежним. Од­на­ко JSONArray todoDataFromServer станет пе­ре­мен­ной клас­са, и мы не бу­дем раз­би­рать ее в ком­понен­ты JSONObject. Вме­сто это­го мы до­ба­вим вы­зов addTodosFromServer() в onCreate() по­сле вы­зо­ва retrieveData(). Это боль­шой фраг­мент ко­да, и мы по­мес­ти­ли его на DVD в Лис­тин­ге 1.&lt;br /&gt;
&lt;br /&gt;
addTodosFromServer() про­сто пе­ре­би­ра­ет объ­ек­ты JSONObject, воз­вра­щен­ные сер­ве­ром в мас­си­ве JSONArray, про­ве­ря­ет, есть ли объ­ект в локаль­ной ба­зе дан­ных, ме­то­дом checkIfTaskExists() и до­бав­ля­ет его в ба­зу дан­ных, ес­ли его там нет.&lt;br /&gt;
&lt;br /&gt;
checkIfTaskExists() по­лу­ча­ет стро­ку «за­дания» из JSONObject и вы­пол­ня­ет SQL-за­прос, ко­то­рый ищет это зна­чение в локаль­ной ба­зе дан­ных. Ес­ли за­прос не воз­вра­ща­ет ре­зуль­та­тов, за­дания не су­ще­ст­ву­ет локаль­но, и его нуж­но до­ба­вить.&lt;br /&gt;
&lt;br /&gt;
На­конец, ме­тод insertTask() до­бав­ля­ет но­вую стро­ку в ба­зу дан­ных, по­лу­ча­ет но­вые зна­чений из JSONObject и за­тем об­нов­ля­ет но­вый URI эти­ми зна­чения­ми. Ис­поль­зуе­мые здесь ме­то­ды insert() и update() рас­смат­ри­ва­лись в пре­ды­ду­щей ста­тье (ес­ли вы ее про­пусти­ли, их код мож­но най­ти на DVD).&lt;/div&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	</feed>