[英]How to kill a thread while finishing app from an AlertDialog in onBackPressed()?
我有一个运行线程的活动,并且在onBackPressed()中的那个活动上也有空,我有一个AlertDialog关闭了该活动。 问题是活动关闭后线程正在运行。
new Thread((new Runnable() {
@Override
public void run() {
//...
}
})).start();
@Override
public void onBackPressed(){
new AlertDialog.Builder(this)
.setTitle("Quit")
.setMessage("Are you sure you want to quit?")
.setNegativeButton("No", null)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(rest.this, MainActivity.class);
finish();
Thread.currentThread().interrupt();
}
}).create().show();
}
创建一个布尔标志,并在(flag)中运行线程。
Thread {while (flag) { Your thread code goes here. } }
在OnClick
函数中将标志更改为False。
在活动中使用线程不是一个好主意。 活动生命周期没有明确提及,但是以我的经验,一旦您调用完成,该过程可能不会完成,并且活动实例可能并不总是被垃圾收集。 另外,在某些情况下,您可能想停止后台操作,而这些操作与您按“返回”无关。
还要注意, Thread.currentThread().interrupt()
没有信号中断, 你开始线程 ,但当前线程。 中断也不保证线程功能将完成。 为了interrupt()
线程,您需要对其进行引用。
需要明确的是:我建议不要使用这种方法。 在此类处理中或在AsyncTasks中使用服务 。 不知道要实现什么目标,很难说什么是最好的方法。
如果您必须坚持使用线程内部活动的想法,建议您向线程函数发出信号,告知它应该退出。 对于线程信令,您可能需要检查以下资源:
这是一个把戏,我也用过
解决方案1 :-
private boolean isActivityRunning=false;
然后在onCreate()
中将其设置为true
isActivityRunning=true;
然后在onStop()
isActivityRunning=false;
并在线程方法中使用它像
new Thread((new Runnable() {
@Override
public void run() {
if(isActivityRunning){
//do your stuff
}
//...
}
})).start();
解决方案2:-根据用法,这是更好的解决方案
使用处理程序
private Handler mHandler;
private Runnable mRunnable;
在您想使用的地方打电话
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
// do your stuff here
}
};
也覆盖
@Override
protected void onResume() {
super.onResume();
if (mHandler != null) {
if(mHandler!=null){
mHandler.postDelayed(mRunnable, 1000);//time in miliseconds
/
}
}
}
@Override
protected void onPause() {
super.onPause();
if (mHandler != null) {
if(mHandler!=null){
mHandler.removeCallbacks(mRunnable);//time in miliseconds
}
}
}
您应该仔细研究为什么我们更喜欢工作线程而不是线程Android中的UI线程和工作线程之间的区别?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.