
Stackoverflow рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдХреНрд╕рд░ рд╕рд╡рд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рджрд┐рдП рдЧрдП рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдПред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ рд╡рд╣ рд╣реИ
рд╕реЗрд╡рд╛ ред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдордВрджреА рдФрд░ рдзреАрдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХрдм рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ ...
рдпрд╣ рд╕реЗрд╡рд╛ рдХреЛ "рдзреАрдорд╛" рдХреНрдпреЛрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдкреНрд░рддреНрдпреЗрдХ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рд╢реБрд░реВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдШрдЯрдХреЛрдВ (рдЧрддрд┐рд╡рд┐рдзрд┐, рд╕реЗрд╡рд╛, рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░) рдХреЛ рдПрдХ "рдореБрдЦреНрдп" рдереНрд░реЗрдб (рдЙрд░реНрдл рдпреВрдЖрдИ-рдереНрд░реЗрдб) рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд▓рдВрдмрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рднрд╛рд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди, рддреЛ рд╣рдореЗрдВ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЙрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдлреЛрд░реНрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреЗ рдмреНрд░реЗрдХ рдорд┐рд▓реЗрдВрдЧреЗ ... рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╢реЗрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдорд╛рди рдереНрд░реЗрдб рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ - рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрджрд┐ рд╕реЗрд╡рд╛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓ рд░рд╣реА рдереА, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ UI рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕реЗ рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ ...
рдХрд╛рд░реНрдп рдХреЛ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рдПрд╕рдбреАрдХреЗ рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдзрд╛рдЧрд╛ рдмрдирд╛рдПрдБ
- AsyncTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЕрдкрдирд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░реЛ
рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ ...
Thread myThread = new Thread(new Runnable() { @Override pubic void run() { doLongAndComplicatedTask(); } }); myThread.start();
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдПрдВ рддрдм рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдПрдХ рд▓рдВрдмрд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдпреВрдЖрдИ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
final TextView txtResult = (TextView)findViewById(R.id.txtResult); Thread myThread = new Thread(new Runnable() { @Override public void run() { txtResult.setText(doLongAndComplicatedTask()); } }); myThread.start();
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред "рд╡рд┐рджреЗрд╢реА" рдзрд╛рдЧреЗ рдиреЗ рдпреВрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА! рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд▓рд╛рдЬ? рдЖрдкрдХреЛ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ ...
final Handler myHandler = new Handler();
AsyncTask - рд╕рдм рдХреБрдЫ рдЖрд╕рд╛рди рд╣реИ
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреВрд▓ рд╣реИ -
рдПрд╕рд┐рдВрдХреНрд╕рдЯреИрд╕реНрдХ ред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХрд┐рд╕ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдЖрдк рд╣реЛрддрд╛ рд╣реИред AsyncTask рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
class LongAndComplicatedTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... noargs) { return doLongAndComplicatedTask(); } @Override protected void onPostExecute(String result) { txtResult.setText(result); } } LongAndComplicatedTask longTask = new LongAndComplicatedTask();
DoBBackground рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдСрдирдкреЛрд╕реНрдЯ рдПрдХреНрд╕реНрдпреВрдЯреНрдпреВрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, UI- рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐:
- AsyncTask рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;
- рдирд┐рд╖реНрдкрд╛рджрд┐рдд () UI рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...
рдЯрд╛рдЗрдорд░ред рд╕рдордп-рд╕рдордп рдкрд░ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ред
рдЬрд╛рд╡рд╛ рджреЛрд╣рд░рд╛рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рдЯрд╛рдЗрдорд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП, рдкрд┐рдЫрд▓реЗ рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ AsyncTask рдмрдирд╛рддреЗ рд╣реИрдВ ...
Timer myTimer = new Timer();
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ "рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ" рдХрд╛рд░реНрдп рдХреЛ рдпреВрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рди рддреЛ рд╣реИрдВрдбрд▓рд░ рдФрд░ рди рд╣реА рдПрд╕рд┐рдВрдХреНрд╕рдЯреИрд╕реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╡реИрд╕реЗ, рдЯрд╛рдЗрдорд░ рдореЗрдВ рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рдПрдлрд╝рд┐рдХреНрд╕рдбреНрд░реЗрдб () рд╡рд┐рдзрд┐ рднреА рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдФрд░ рдЕрдиреБрд╕реВрдЪреА () рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рддрд░реАрдХрд╛ рд╣реИред ScheduledThreadPoolExecutorред
рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ
ScheduledThreadPoolExecutor рд╡рд░реНрдЧ рд╕реВрдЪреАрдмрджреНрдз рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкреВрд▓ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╛рдиреА рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд░реНрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рд╕рд╛рде рдХрдИ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╕рдВрдЦреНрдпрд╛ рдХреА рдЙрдкрд▓рдмреНрдз рд╕рдВрдЦреНрдпрд╛ рдЗрд╕реЗ рд░реЛрдХрддреА рд╣реИред рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ
рд▓рд┐рдП, рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВ ред
рдкреНрд░рддреНрдпреЗрдХ рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ "рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░" рдЙрдкрд▓рдмреНрдз рд╣реИ -
рд╢реЗрдбреНрдпреВрд▓реНрдб рдлрд╝реЙрдЗрд▓ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд▓ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд░рджреНрдж рдХрд░реЗрдВред
рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдмрд╛рдЗрдХред рдереНрд░реЗрдб, рд▓реВрдкрд░, рд╣реИрдВрдбрд▓рд░ред
рдФрд░ рдЖрдк рдЕрдкрдиреА
рдмрд╛рдЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдХ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
public class LoopingThread extends Thread { private CountdownLatch syncLatch = new CountdownLatch(1); private Handler handler; public LoopingThread() { super(); start(); } @Override public void run() { try { Looper.prepare(); handler = new Handler(); syncLatch.countDown(); Looper.loop(); } catch(Exception e) { Log.d("LoopingThread", e.getMessage()); } } public Handler getHandler() { syncLatch.await(); return handler; } } Thread loopThread = new LoopingThread();
рдПрдХ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпрд╣ рдзрд╛рдЧрд╛, рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ (рдХрд╛рд░реНрдп рднреЗрдЬрдиреЗ) рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getHandler () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ "рдИрд╡реЗрдВрдЯ" рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрдирдЪреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЬреЛ рдзрд╛рдЧрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╣ рд╡рд░реНрдХрд░ рдереНрд░реЗрдб рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рди рдХрд░реЗ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред