如何从onBackPressed()中的AlertDialog完成应用程序时杀死一个线程?

时间:2018-03-28 18:38:34

标签: java android multithreading button android-alertdialog

我有一个运行线程的活动以及onBackPressed()中的该活动void我有一个关闭活动的AlertDialog。 问题是活动关闭后线程正在运行。

open('GET', 'folder/controller.php?param=1', true)

3 个答案:

答案 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?