Как остановить поток, когда действие, в котором он был запущен, осталось? - PullRequest
0 голосов
/ 02 июня 2018

Я смотрел на onBackPressed(), onPause() и onStop(), но самая большая проблема, которую я могу найти, заключается в том, что мой Thread не объявлен в Activity.У меня есть MainActivity и TiltActivity.Существует Button, который при нажатии отправляет вас от MainActivity до TiltActivity.Оказавшись внутри TiltActivity, я создаю объект класса TCP_IP_Client.Затем я запускаю «Поток», который объявлен внутри TCP_IP_Client.

Я не могу передать параметр Thread в onBackPressed(), onPause() или onStop().Как мне остановить Thread, если TiltActivity осталось, если я не могу прервать его в предыдущих переопределенных функциях.Опять же, Thread не объявлено в TiltActivity, что значительно облегчило бы прерывание Thread.Если вам нужны дополнительные разъяснения, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Предположим, у вас есть какая-то петля в ThreadTiltActivity вы определяете атрибут для хранения ссылки на Thread и общего boolean, чтобы он знал, что он должен остановиться.И вы предоставляете синхронизированные методы для доступа к общим переменным.

В onResume() вы создаете и запускаете Thread, поэтому он воссоздается при каждом входе в действие.И в onPause() вы даете сигнал об остановке и прерываете его каждый раз, когда его собираются убрать с переднего плана;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class ThreadActivity extends AppCompatActivity {

    public static final String TAG = ThreadActivity.class.getName();

    boolean stopThread = false;
    Thread t;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        startTheThread();
    }

    public synchronized boolean continueRunning(){
        return !stopThread;
    }

    public synchronized void startTheThread(){
        this.stopThread = false;
        Toast.makeText(ThreadActivity.this,"Thread Starting",Toast.LENGTH_SHORT).show();
        t = new Thread(new Runnable() {
            @Override
            public void run() {
                while(continueRunning()){
                    try {
                        Thread.sleep(5000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(ThreadActivity.this,"Thread running",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }catch (InterruptedException e){
                        ;//do nothing
                    }
                }
            }
        });
        t.start();
    }
    public synchronized void stopTheThread(){
        this.stopThread = true;
        t.interrupt();
        Toast.makeText(ThreadActivity.this,"Thread stopped",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPause() {
        super.onPause();
        stopTheThread();

    }
}
0 голосов
/ 02 июня 2018

Вам необходимо добавить метод в TCP_IP_Client, который остановит объявленный и запущенный поток.Затем вы можете вызвать этот метод в своем экземпляре TCP_IP_Client из вашего TitleActivity (используя переменную-член, которая содержит экземпляр TCP_IP_Client).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...