如何在 Activity 开始时停止线程?

How do you stop a Thread when the Activity it was started in is left?

我查看了 onBackPressed()onPause()onStop(),但我能找到的最大问题是我的 Thread 没有在Activity。我有 MainActivityTiltActivity。有一个 Button,按下时,会将您从 MainActivity 发送到 TiltActivity。一旦进入 TiltActivity,我就创建了一个 class TCP_IP_Client 的对象。然后我启动一个在 TCP_IP_Client.

中声明的 'Thread'

我无法将 Thread 参数传递给 onBackPressed()onPause()onStop()。如果我不能在之前的重写函数中中断它,我该如何在 TiltActivity 剩余时停止 Thread。同样,Thread 未在 TiltActivity 中声明,这将使中断 Thread 变得容易得多。如果您需要进一步说明,请告诉我。

您需要向 TCP_IP_Client 添加一个方法来停止它声明和启动的线程。然后,您可以从您的 TitleActivity 对 TCP_IP_Client 的实例调用该方法(使用包含 TCP_IP_Client 实例的成员变量)。

假设您在 Thread 中有某种循环。 在 TiltActivity 中,您定义一个属性来保存对 Thread 的引用,并定义一个共享的 boolean 来让它知道它应该停止。 并且您提供了用于访问共享变量的同步方法。

onResume() 中创建并启动 Thread,因此每次进入 activity 时都会重新创建它。在 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();

    }
}