Developer от Бога

DV

четверг, 6 июля 2017 г.

Android. Thread - потоки

Программа , несмотря на то что может прыгать с одного места кода в другое - исполняется построчно и линейно. Если в программе происходит некоторый процесс (воспроизведение музыки, видео, или выполнение каких то расчетов) невозможно повлиять но ход события со стороны, пока не дойдет до конца этот действующий процесс. В таких случаях используют - многопоточность. Поток - это и есть линейное выполнение программы. Если нужно в приложении организовать несколько независимых векторов выполнения кода - создают такое же количество потоков, которые параллельно выполняют свою задачу и могут влиять друг на друга.
Класс Thread создает нужный дополнительный независимый поток и принимает в своем конструкторе объект Runnable , в котором указывается нужное действие. Третий важный класс в работе с потоками это Handler, он есть связующим звеном с помощью которого разные потоки могут влиять друг на друга. Без Handler, поток который например, отсчитывает время, не смог бы отправить состояние своего счетчика любому объекту из главного потока программы, в котором созданы методы для изображения результатов на дисплее.
В данном примере программы показана работа простого таймера отсчитывающего время до нуля. Доказательством "параллельности" будет тот факт, что в любой момент, пока счетчик не досчитал до конца, есть возможность начать отсчитывание сначала, нажав кнопку стоп:


  1. import android.os.Handler;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. public class MainActivity extends AppCompatActivity {
  8. Handler h;
  9. int i=1000;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. Button playButton = (Button) findViewById(R.id.play);
  15. Button stopButton = (Button) findViewById(R.id.stop);
  16. final TextView textView = (TextView)findViewById(R.id.textView);
  17. h = new Handler() {
  18. public void handleMessage(android.os.Message msg) {
  19. textView.setText(msg.what);
  20. };
  21. };
  22. final Runnable runaudio = new Runnable() {
  23. public void run() {
  24. while(i>0) {
  25. for (int i = 0; i < 1000000; i++) {
  26. }
  27. h.sendEmptyMessage(i);
  28. i--;
  29. }
  30. }};
  31. playButton.setOnClickListener(new View.OnClickListener() {
  32. public void onClick(View view){
  33. Thread myThread = new Thread(runaudio);
  34. myThread.start();
  35. }
  36. });
  37. stopButton.setOnClickListener(new View.OnClickListener() {
  38. public void onClick(View view){
  39. i=1000;
  40. }
  41. });
  42. }
  43. } }

Комментариев нет:

Отправить комментарий