我有一个运行线程的活动以及onBackPressed()中的该活动void我有一个关闭活动的AlertDialog。 问题是活动关闭后线程正在运行。
open('GET', 'folder/controller.php?param=1', true)
答案 0 :(得分:0)
创建一个布尔标志并在(标记)时运行线程。
Thread {while (flag) { Your thread code goes here. } }
在OnClick
函数中将标志更改为False。
答案 1 :(得分:0)
在活动中使用线程不是一个好主意。 activity lifecycle没有明确提及,但根据我的经验,该过程可能无法完成,并且一旦调用完成后,活动实例可能并不总是被垃圾收集。此外,在某些情况下,您可能希望停止与您按下"返回"无关的后台操作。
另请注意,Thread.currentThread().interrupt()
不会对您启动的线程发出信号中断,但会向当前线程发出信号中断。 Interrupt也不保证线程函数将完成。为了interrupt()
一个线程,你需要一个引用它。
要明确:我建议不要这样做。使用services进行此类处理或AsyncTasks。如果不知道自己想要达到什么目标,很难说最好的方法是什么。
如果你必须坚持你的线程内活动的想法,我建议你向线程函数发出信号,它应该退出。对于线程信令,您可能需要检查以下资源:
答案 2 :(得分:0)
这是一个技巧,我也用过
解决方案1 : -
private boolean isActivityRunning=false;
然后在onCreate()
设置为真
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
}
}
}
你应该仔细考虑为什么我们更喜欢工作线程而不是线程 Difference between UI Thread and Worker Thread in Android?