рдЙрддреНрддрд░рджрд╛рдпреА рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдпрд╛ рддрд╕реНрд╡реАрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ 1001 рддрд░реАрдХреЗ

рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЙрд╕реА рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдЬ рдбрд╛рдЙрдирд▓реЛрдб / рдкрдврд╝рдиреЗ / рдмрдЪрд╛рдиреЗ / рдЧрд┐рдирдиреЗ рдХреЗ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╛рд░рд╛рдЬрд╝ рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдгрдп рдХрдм рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЗрдВ, рдЬреИрд╕реЗ рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕ рдФрд░ java.util.concurrent рдкреИрдХреЗрдЬ, рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВред

рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рдмрд╛рддреЗрдВ рдмрддрд╛рдП рдмрд┐рдирд╛ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП ...

рдзрд╛рдЧрд╛

рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕, рдЬреЛ рдЬрд╛рд╡рд╛ рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╢рд╛рдпрдж рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрдк рдереНрд░реЗрдб рд╕реЗ рдПрдХ рд╡рд╛рд░рд┐рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд░рдирдиреЗрдмрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1. рд╡рд┐рд╕реНрддрд╛рд░ рдзрд╛рдЧрд╛ред
class WorkingThread extends Thread{ @Override public void run() { //  } } 





рдЙрджрд╛рд╣рд░рдг 2. рдЪрд▓рдиреЗ рдпреЛрдЧреНрдпред
 class WorkingClass implements Runnable{ @Override public void run() { //  } } WorkingClass workingClass = new WorkingClass(); Thread thread = new Thread(workingClass); thread.start(); 


рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рд╕реЗ рд▓реЗ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдПрдВрдбреНрд░реЙрдЗрдб рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдХреЗ рдХрд╛рд░рдг, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗрд╡рд▓ рдЙрд╕ рдереНрд░реЗрдб рд╕реЗ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рддрддреНрд╡ рдмрдирд╛рдП рдЧрдП рдереЗ, рдЕрдиреНрдпрдерд╛ рдПрдХ CallFFromWrongThreadException рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, Android API рдПрдХ рд╕рд╛рде рдХрдИ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1. рджреЗрдЦреЗрдВ # рдкреЛрд╕реНрдЯ (рдЪрд▓рд╛рдиреЗ рдпреЛрдЧреНрдп рдХрд╛рд░реНрд░рд╡рд╛рдИ)ред
 public class MainActivity extends Activity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); WorkingClass workingClass = new WorkingClass(); Thread thread = new Thread(workingClass); thread.start(); } class WorkingClass implements Runnable{ @Override public void run() { //  //  UI   Runnable textView.post(new Runnable() { @Override public void run() { textView.setText("The job is done!"); } }); } } } 



рдЙрджрд╛рд╣рд░рдг 2. рдЧрддрд┐рд╡рд┐рдзрд┐ # runOnUiThread (рд░рди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд░рд┐рдпрд╛)ред
 public class MainActivity extends Activity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); WorkingClass workingClass = new WorkingClass(); Thread thread = new Thread(workingClass); thread.start(); } class WorkingClass implements Runnable{ @Override public void run() { //  //  UI   Runnable MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { textView.setText("The job is done!"); } }); } } } 



рдЙрджрд╛рд╣рд░рдг 3. рд╣реИрдВрдбрд▓рд░ред
 public class MainActivity extends Activity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); WorkingClass workingClass = new WorkingClass(true); Thread thread = new Thread(workingClass); thread.start(); } class WorkingClass implements Runnable{ public static final int SUCCESS = 1; public static final int FAIL = 2; private boolean dummyResult; public WorkingClass(boolean dummyResult){ this.dummyResult = dummyResult; } @Override public void run() { //  //    if (dummyResult){ //      uiHandler.sendEmptyMessage(SUCCESS); } else { //       Message msg = Message.obtain(); msg.what = FAIL; msg.obj = "An error occurred"; uiHandler.sendMessage(msg); } } } Handler uiHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case WorkingClass.SUCCESS: textView.setText("Success"); return true; case WorkingClass.FAIL: textView.setText((String)msg.obj); return true; } return false; } }); } 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдХреЛрдб рд░рдирдиреЗрдмрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдмрдбрд╝реЗ рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рдХреЗ рдвреЗрд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб 1.5 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AsyncTask рдХреНрд▓рд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдереА

AsyncTask

AsyncTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, AsyncTask рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛: onPreExecute (), doInBackground (Params ...), onPostExecute (рдкрд░рд┐рдгрд╛рдо), рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдФрд░ рдЕрдВрддрд┐рдо UI рдереНрд░реЗрдб рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЕрд▓рдЧ рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, AsyncTask рд╡рд░реНрдЧ UI рдереНрд░реЗрдб рдХреЛ UI рд╕реНрдЯреНрд░рд┐рдк (рдкреНрд░рдЧрддрд┐ ...) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ UI рдереНрд░реЗрдб рдореЗрдВ onProgressUpdate (рдкреНрд░рдЧрддрд┐ ...) рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

AsyncTask рдЙрджрд╛рд╣рд░рдг
 public class MainActivity extends Activity { private static final String IMAGE_URL = "http://eastbancgroup.com/images/ebtLogo.gif"; TextView textView; ImageView imageView; ProgressDialog progressDialog; DownloadTask downloadTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); imageView = (ImageView)findViewById(R.id.imageView); downloadTask = new DownloadTask(); // ,      downloadTask.execute(IMAGE_URL); } @Override protected void onStop() { //   , //  Activity downloadTask.cancel(true); super.onStop(); } /* *    AsyncTask<Params, Progress, Result> *  ,     generic-. * Params -   .     String, .. *   url  * Progress -  ,      . *    Integer. * Result -  .    Drawable. */ class DownloadTask extends AsyncTask<String, Integer, Drawable>{ @Override protected void onPreExecute() { //    progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setIndeterminate(false); progressDialog.setMax(100); progressDialog.setProgress(0); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Downloading Image"); progressDialog.show(); } @Override protected Drawable doInBackground(String... params) { //       //  URLConnection int count; try { URL url = new URL(params[0]); URLConnection conection = url.openConnection(); conection.connect(); int lenghtOfFile = conection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream(), 8192); OutputStream output = new FileOutputStream("/sdcard/downloadedfile.jpg"); byte data[] = new byte[256]; long total = 0; while ((count = input.read(data)) != -1) { //,     if (isCancelled()){ return null; } total += count; output.write(data, 0, count); //  . // ,     //       //onProgressUpdate    publishProgress((int)((total*100)/lenghtOfFile)); } output.flush(); output.close(); input.close(); } catch (Exception e) { Log.e("Error: ", e.getMessage()); } String imagePath = Environment.getExternalStorageDirectory().toString() + "/downloadedfile.jpg"; return Drawable.createFromPath(imagePath); } @Override protected void onProgressUpdate(Integer... progress) { progressDialog.setProgress(progress[0]); } //     @Override protected void onPostExecute(Drawable result) { imageView.setImageDrawable(result); progressDialog.dismiss(); } //     onPostExecute, //      //AsyncTask#cancel(boolean mayInterruptIfRunning) @Override protected void onCancelled() { } } } 



рдЪрд┐рддреНрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдЙрджрд╛рд╣рд░рдг AsyncTask рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: рддреИрдпрд╛рд░реА, рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрдЪрд╛рд▓рди, рдЕрджреНрдпрддрди рдкреНрд░рдЧрддрд┐, рдЕрдВрддрд┐рдо рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдХрд╛рдо рд░реЛрдХрдирд╛ред рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдФрд░ рдореБрдЦреНрдп рдПрдХ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджреНрдпрдкрд┐ рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП AsyncTask рдЕрдХреНрд╕рд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЕрдзрд┐рдХ рд▓рд╛рднрдкреНрд░рдж рд╣реИред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдХрд╛рд░рдг, рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдЯрд╛рдЗрдорд░)ред AsyncTask рдХрд╛ рдРрд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдХрддрд╛рд░ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рдмрд╛рдж рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдереНрд░реЗрдб рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдорд░ред
 public class MainActivity extends Activity { TextView textView; private int counter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); counter = 0; textView = (TextView)findViewById(R.id.hello); //  new Thread(new WorkingClass()).start(); } class WorkingClass implements Runnable{ public static final int RELAUNCH = 1; private static final int DELAY = 1000; @Override public void run() { //  //      1000ms uiHandler.sendEmptyMessageDelayed(RELAUNCH, DELAY); } } Handler uiHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { //  if (msg.what == WorkingClass.RELAUNCH){ textView.setText("Times: "+counter); counter++; new Thread(new WorkingClass()).start(); return true; } return false; } }); } 


рдиреЛрдЯ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдХрдИ AsyncTask рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ AsyncTask # executeOnExecutor (рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░ рдПрдХреНрдЬрд╝рдХреНрдпреВрдЯ, рдкрд░рдореНрд╕ ... рдкрд░рдореЗрд╕) рд╡рд┐рдзрд┐ https://developer.android.com/reference/android/os-AsyncTask.html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдереНрд░реЗрдб рдФрд░ AsyncTask рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдореЙрдбрд▓ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рдирд╛, рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ, AsyncTask рдпрд╛ рдереНрд░реЗрдб рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛, рдЬрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕реНрдХреНрд░реАрди рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╕реНрдХреНрд░реАрди рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ AsyncTask рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЙрддрдиреА рд╣реА рддреЗрдЬрд╝реА рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЙрдЯрдСрдлрд╝рдореИрд░реЗрд░реА рдПрд░рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рднреА рдмрджрддрд░, рд╢рд╛рдпрдж, рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рд╢реИрдХреНрд╖рд┐рдХ рд▓реЗрдЦреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рдирдП рдХрд╛рд░реНрдп рдпрд╛ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рд╣реЗрдЬреЗ рдмрд┐рдирд╛, рдЖрдк рдЦреБрдж рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдЙрд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд░реЛрдХ рджреЗрдВред

рдХреБрд▓:

рдереНрд░реЗрдб рдФрд░ AsyncTask рд╡рд░реНрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╕реЗ, рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪрд┐рдд рд╣реИ:

рдХрд╛рд░реНрдп рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП AsyncTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪрд┐рдд рд╣реИ:

рдереНрд░реЗрдб рдФрд░ AsyncTask рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд▓рдЧрд╛рдИ рдЧрдИ рдореБрдЦреНрдп рд╕реНрдерд┐рддрд┐: рдпрджрд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ / рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдЧрддрд┐рд╡рд┐рдзрд┐ / рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рд░реБрдХрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЛрдбрд░

рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдиреБрдореЗрдп рд╣реИ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдПрдПрдирдЖрд░ рд╕рдВрджреЗрд╢ рднреА рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рдмреЗрд╕ / рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓ рддрдХ рддрдХ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдереНрд░реЗрдб рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕рдЯрд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдВрдбреНрд░реЙрдЗрдб 3.0 рдореЗрдВ рд▓реЛрдбрд░ рдФрд░ рд▓реЛрдбрд░рдореИрдиреЗрдЬрд░ рдЬреИрд╕реЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдлреНрд░реЗрдЧрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рд╣реИред рдкреБрд░рд╛рдиреЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб рд╕рдкреЛрд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рдорд╛рди рдХрдХреНрд╖рд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

1. рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд▓реЛрдбрд░ рд╡рд░реНрдЧ рдпрд╛ рдЙрд╕рдХреЗ рдорд╛рдирдХ рд╡рдВрд╢ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
2. рдЗрд╕рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ-рдЯрд╛рдЗрдк рдбреА рдбреЗрдЯрд╛ рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
3. рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ, LoaderManager рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рд▓реЛрдбрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ LoaderManager.LoaderCallbacks рдХреЛ рдореИрдиреЗрдЬрд░ рдХреЛ рдХреЙрд▓рдмреИрдХ рдХрд░реЗрдВред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ, рдорд╛рдирдХ CursorLoader рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдлреЛрди рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЛрдбрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдгред
 public class MainActivity extends ListActivity implements LoaderCallbacks<Cursor> { //     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, }; private static final int LOADER_ID = 1; private SimpleCursorAdapter adapter; TextView textview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //,      textview = (TextView)findViewById(R.id.loading); //  ,     getListView().setVisibility(View.GONE); //  ListView adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, new int[] { android.R.id.text1, android.R.id.text2 }, 0); setListAdapter(adapter); // Loader' //  id Loader'  callback LoaderManager lm = getLoaderManager(); lm.initLoader(LOADER_ID, null, this); } //    Loader,   //      @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri baseUri = Contacts.CONTENT_URI; String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))"; return new CursorLoader(this, baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); } //  ,     //  ,      @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { switch (loader.getId()) { case LOADER_ID: adapter.swapCursor(cursor); textview.setVisibility(View.GONE); getListView().setVisibility(View.VISIBLE); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.swapCursor(null); } } 


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрдорддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

рдХреБрд▓:

рд▓реЛрдбрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдЧрддрд┐рд╡рд┐рдзрд┐, рдЯреБрдХрдбрд╝рд╛) рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде рддреБрд▓рдиреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реЗрд╡рд╛ рдФрд░ рдЗрд░рд╛рджреЗ

рд╕реЗрд╡рд╛ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕реЗрд╡рд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЕрдкрдирд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЕрддрд┐рд░рд┐рдХреНрдд рдереНрд░реЗрдбреНрд╕ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ServiceConnection / IBinder рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢ред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╛рд░ рд╕реЗрд╡рд╛ рдХреЗ рдЪрд▓ рд░рд╣реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ, рдпрд╣ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдВрдЪрд╛рд░ рдХреЗрд╡рд▓ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдгред
 public class BackgroundService extends Service { public static final String CHANNEL = BackgroundService.class.getSimpleName()+".broadcast"; //     , //     Intent @Override public int onStartCommand(Intent intent, int flags, int startId) { //        sendResult(); return Service.START_NOT_STICKY; } //     , // Broadcast private void sendResult() { Intent intent = new Intent(CHANNEL); sendBroadcast(intent); } @Override public IBinder onBind(Intent intent) { return null; } } 


 public class MainActivity extends Activity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); //     registerReceiver(receiver, new IntentFilter(BackgroundService.CHANNEL)); // ,    Intent Intent intent = new Intent(this, BackgroundService.class); startService(intent); } @Override protected void onStop() { //    unregisterReceiver(receiver); super.onStop(); } private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { textView.setText("Message from Service"); } }; } 


рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕реЗрд╡рд╛, рд╕рд╛рде рд╣реА рдЧрддрд┐рд╡рд┐рдзрд┐, рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ рдЗрдВрдЯреЗрдВрдЯрд╕реЗрд╡рд░ рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирдХ рд╕реЗрд╡рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ, рддреЛ IntentService рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ IntentService # onHandleIntent (рдЗрд░рд╛рджрд╛ рдЖрд╢рдп) https://developer.android.com/reference/android/app/IntentService/ononandandIntent(android.content.Intent.Intent) рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЬрд┐рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдЖрдиреЗ рдкрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

IntentService рдЙрджрд╛рд╣рд░рдгред
 public class DownloadService extends IntentService { public DownloadService() { super("DownloadService"); } public static final String CHANNEL = DownloadService.class.getSimpleName()+".broadcast"; private void sendResult() { Intent intent = new Intent(CHANNEL); sendBroadcast(intent); } @Override public IBinder onBind(Intent intent) { return null; } //        @Override protected void onHandleIntent(Intent intent) { //  //     sendResult(); } } 

 public class MainActivity extends Activity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); //     registerReceiver(receiver, new IntentFilter(DownloadService.CHANNEL)); // ,    Intent Intent intent = new Intent(this, DownloadService.class); startService(intent); } @Override protected void onStop() { //    unregisterReceiver(receiver); super.onStop(); } private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { textView.setText("Message from Service"); } }; } 



рдХреБрд▓:

рд╕реЗрд╡рд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рдЖрдорддреМрд░ рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реЗрд╡рд╛ рддрдм рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдпрд╣ рдХрд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ (рдЗрдЪреНрдЫрд┐рдд) рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдПрдХ рдХрддрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдЖрджрд┐, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢ рдХрд╣рд╛рдВ рд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред

DownloadManager
рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ 9 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ, рдбреЙрд╡реЛрдбрдордирдЧрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ рд╡рд╣ рдЗрд╕ рдЙрд░реА рд╕реЗрд╡рд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЙрд╕ рдкрд╛рда рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реВрдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ DownloadManager рдХреЛ рдЗрд╕ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕реЗрд╡рд╛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧреАред рдбрд╛рдЙрдирд▓реЛрдб рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдмрд╛рд░ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдмрдирд╛рдПрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣реА рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг DownloadManagerред

DownloadManager рдЙрджрд╛рд╣рд░рдг
 public class MainActivity extends Activity { private static final String IMAGE_URL = "http://eastbancgroup.com/images/ebtLogo.gif"; ImageView imageView; DownloadManager downloadManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView)findViewById(R.id.imageView); //   DownloadManager  downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); //   Request request = new Request(Uri.parse(IMAGE_URL)); request.setTitle("Title"); //   request.setDescription("My description"); //   request.setMimeType("application/my-mime"); //mine type   //  ,  , //-      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //    downloadManager.enqueue(request); } @Override protected void onResume() { super.onResume(); //     registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED)); }; @Override protected void onPause() { super.onPause(); //    unregisterReceiver(receiver); }; BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); //  ,    if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)){ long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor cursor = dm.query(query); if (cursor.moveToFirst()){ int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); if (DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columnIndex)) { String uriString = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); imageView.setImageURI(Uri.parse(uriString)); } } //     } else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)){ DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); //        , //       ,   //  long[] ids = intent.getLongArrayExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS); DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(ids); Cursor cursor = dm.query(query); int idIndex = cursor.getColumnIndex(DownloadManager.COLUMN_ID); if (cursor.moveToFirst()){ do { //    id   //   long downloadId = cursor.getLong(idIndex); } while (cursor.moveToNext()); } } } }; } 


DownloadManager рдХреЗ рдХрд╛рдо рдореЗрдВ рдПрдХ рдЦрд╝рд╛рд╕рд┐рдпрдд рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдПрдХ рд╕рдлрд▓ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ DownloadManager.ACTION_NOTIFICATION_CLICKED рдЬреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕реЗрд╡рд╛ рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧреА рдЬреЛ рдЗрд╕ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕ рдШрдЯрдирд╛ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЖрд╢рдп рдлрд╝рд┐рд▓реНрдЯрд░:

 <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="application/my-mime" /> (mime type,   ) <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рдЖрдк рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд▓реЙрдиреНрдЪ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЗрд░рд╛рджреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

рдЗрд░рд╛рджрд╛ рдЗрд░рд╛рджрд╛ = getIntent ();
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ = рдЖрд╢рдп редgetDataString ();

рдХреБрд▓:

DownloadManager рд╕реЗрд╡рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реБрдЪрд┐ рд▓реЗ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд┐рддреНрд░, рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдФрд░ рдмрд╣реБрдд рдХреБрдЫредрдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рднреА рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреИрдЯрд░реНрди рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИрдВред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/In192998/


All Articles