【问题标题】:How to kill a thread while finishing app from an AlertDialog in onBackPressed()?如何在 onBackPressed() 中的 AlertDialog 完成应用程序时杀死线程?
【发布时间】:2018-03-28 18:38:33
【问题描述】:

我有一个运行线程的活动,并且在 onBackPressed() void 中的那个活动上我有一个关闭活动的 AlertDialog。 问题是activity关闭后线程还在运行。

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();
}

【问题讨论】:

  • 让线程成为你的activity类中的一个字段,然后退出时调用线程对象上的interrupt()方法

标签: java android multithreading button android-alertdialog


【解决方案1】:

这是一个技巧,我也用过

解决方案 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?

【讨论】:

    【解决方案2】:

    制作一个布尔标志并在(标志)时运行线程。

    Thread {while (flag) { Your thread code goes here. } }
    

    OnClick 函数中将标志更改为 False。

    【讨论】:

      【解决方案3】:

      在活动中使用线程并不是一个好主意。 activity lifecycle 没有明确提到这一点,但根据我的经验,一旦你调用完成,进程可能不会完成,并且活动实例可能并不总是被垃圾收集。此外,在某些情况下,您可能希望停止与按“返回”无关的后台操作。

      另请注意,Thread.currentThread().interrupt() 确实您启动的线程发出信号中断,而是向当前线程发出信号中断。 Interrupt 也不保证线程函数会完成。为了interrupt() 一个线程,你需要一个对它的引用。

      明确一点:我建议不要使用这种方法。使用services 进行此类处理或AsyncTasks。在不知道自己想要达到什么目标的情况下,很难说什么是最好的方法。

      如果你必须坚持你的线程内部活动的想法,我建议你向线程函数发出信号,它应该退出。对于线程信号,您可能需要检查以下资源:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 2015-09-18
        • 2018-03-08
        • 1970-01-01
        相关资源
        最近更新 更多