繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM