如何在启动活动时停止线程?

时间:2018-06-01 21:38:15

标签: android onpause onbackpressed

我查看了onBackPressed()onPause()onStop(),但我发现的最大问题是我的Thread未在Activity。我有MainActivityTiltActivity。有一个Button,按下后会将您从MainActivity发送到TiltActivity。进入TiltActivity后,我创建了一个类TCP_IP_Client的对象。然后我开始了一个'线程'在TCP_IP_Client内声明。

我无法将Thread参数传递给onBackPressed()onPause()onStop()。如果我在以前的重写函数中不能中断Thread,我该如何停止TiltActivity。同样,Thread未在TiltActivity中声明,这样可以更轻松地中断Thread。如果您需要进一步说明,请告诉我。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设您在Thread中有某种循环。 在TiltActivity中,您定义了一个属性来保存对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();

    }
}