Android 当一个线程在其中启动的活动离开时,如何停止该线程?
我已经研究了Android 当一个线程在其中启动的活动离开时,如何停止该线程?,android,onpause,onbackpressed,Android,Onpause,Onbackpressed,我已经研究了onBackPressed()、onPause()和onStop(),但我发现,针对这些问题,我的线程没有在活动中声明。我有main活动和TiltActivity。有一个按钮,按下该按钮时,会将您从main活动发送到TiltActivity。进入TiltActivity后,我创建了类TCP\u IP\u Client的对象。然后启动一个“线程”,该线程在TCP\u IP\u客户端中声明 我无法将线程参数传递给onBackPressed()、onPause()或onStop()。如果我
onBackPressed()
、onPause()
和onStop()
,但我发现,针对这些问题,我的线程
没有在活动中声明。我有main活动
和TiltActivity
。有一个按钮
,按下该按钮时,会将您从main活动
发送到TiltActivity
。进入TiltActivity
后,我创建了类TCP\u IP\u Client
的对象。然后启动一个“线程”,该线程在TCP\u IP\u客户端
中声明
我无法将线程
参数传递给onBackPressed()
、onPause()
或onStop()
。如果我不能在以前的重写函数中中断线程,我如何停止线程
一次活动
。同样,线程
未在活动
中声明,这将使中断线程
更加容易。如果您需要进一步的澄清,请让我知道。您需要向TCP_IP_客户端添加一个方法,该方法将停止它声明并启动的线程。然后可以从TitleActivity(使用保存TCP_IP_客户端实例的成员变量)在TCP_IP_客户端实例上调用该方法。这是假设在线程中有某种循环。
在TiltActivity
中,定义一个属性来保存对线程的引用,并定义一个共享的布尔值来让它知道应该停止。
您还提供了访问共享变量的同步方法
在onResume()
中,创建并启动线程
,以便在每次进入活动时重新创建该线程。在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();
}
}
你不能保留对它的引用并停止onPause/onStop函数中的线程吗?你不能将引用传递给函数public void onPause(线程t)
不是一件令人遗憾的事情。将其作为活动中的一个字段,并将其设置为onCreate,然后您可以在onPause中访问它。我将在周一尝试此操作,并让您知道它的运行情况。这听起来像是一个我真的应该想到的好的简单的修复方法。非常感谢。