Программа , несмотря на то что может прыгать с одного места
кода в другое - исполняется построчно и линейно. Если в
программе происходит некоторый процесс (воспроизведение музыки, видео, или выполнение каких то расчетов) невозможно
повлиять но ход события со стороны, пока не дойдет до конца этот действующий процесс. В таких случаях используют -
многопоточность.
Поток - это и есть линейное выполнение программы. Если нужно в приложении организовать несколько независимых векторов
выполнения кода - создают такое же количество потоков, которые параллельно выполняют свою задачу и могут влиять друг на
друга.
Класс Thread создает нужный дополнительный независимый поток и принимает в своем конструкторе объект Runnable , в котором указывается нужное действие. Третий важный класс в работе с потоками это Handler, он есть связующим звеном с помощью которого разные потоки могут влиять друг на друга. Без Handler, поток который например, отсчитывает время, не смог бы отправить состояние своего счетчика любому объекту из главного потока программы, в котором созданы методы для изображения результатов на дисплее.
В данном примере программы показана работа простого таймера отсчитывающего время до нуля. Доказательством "параллельности" будет тот факт, что в любой момент, пока счетчик не досчитал до конца, есть возможность начать отсчитывание сначала, нажав кнопку стоп:
Класс Thread создает нужный дополнительный независимый поток и принимает в своем конструкторе объект Runnable , в котором указывается нужное действие. Третий важный класс в работе с потоками это Handler, он есть связующим звеном с помощью которого разные потоки могут влиять друг на друга. Без Handler, поток который например, отсчитывает время, не смог бы отправить состояние своего счетчика любому объекту из главного потока программы, в котором созданы методы для изображения результатов на дисплее.
В данном примере программы показана работа простого таймера отсчитывающего время до нуля. Доказательством "параллельности" будет тот факт, что в любой момент, пока счетчик не досчитал до конца, есть возможность начать отсчитывание сначала, нажав кнопку стоп:
- import android.os.Handler;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends AppCompatActivity {
- Handler h;
- int i=1000;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button playButton = (Button) findViewById(R.id.play);
- Button stopButton = (Button) findViewById(R.id.stop);
- final TextView textView = (TextView)findViewById(R.id.textView);
- h = new Handler() {
- public void handleMessage(android.os.Message msg) {
- textView.setText(msg.what);
- };
- };
- final Runnable runaudio = new Runnable() {
- public void run() {
- while(i>0) {
- for (int i = 0; i < 1000000; i++) {
- }
- h.sendEmptyMessage(i);
- i--;
- }
- }};
- playButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view){
- Thread myThread = new Thread(runaudio);
- myThread.start();
- }
- });
- stopButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view){
- i=1000;
- }
- });
- }
- } }
Комментариев нет:
Отправить комментарий