【问题标题】:How to check if thread is alive after restarting an Activity?如何在重新启动 Activity 后检查线程是否处于活动状态?
【发布时间】:2020-07-10 15:25:55
【问题描述】:

我正在一个线程上运行繁重的操作,该操作在按钮单击时被调用。为了防止用户再次单击该按钮,我只是检查thread.isAlive(),只要我在当前活动中,它就可以正常运行。当我按下 backpress 并再次进入此活动时,thread.isAlive() 返回 false 并再次开始执行该密集函数,因为我正在 onCreate 中创建新线程。我该如何解决这个问题?我的代码如下

 Thread thread;
     @Override
           protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_backup_restore);
           Backup backupobj= new Backup();
            thread= new Thread (new BackupThread(backupobj));

                  button.setOnClickListener(v -> { 
                  if(posts.size()>0) {

                 if (!thread.isAlive()) {
                   thread.start();

                 }
                 else {
                     Toast toast = Toast.makeText(getApplicationContext(), "Backup in Progress" , 
                     Toast.LENGTH_LONG);
                     toast.show();

                 }

         }
     });}

BackupThread 类

class BackupThread extends Thread {
BackupRestore.Backup backup;

BackupThread(BackupRestore.Backup obj)
{
    this.backup=obj;
}


@Override
public void run() {

    backup.overallbackup();
    backup.dbbackup();
    backup.deletetempfolder();

}

【问题讨论】:

  • 即使它没有回答您的问题,您是否考虑过使用WorkManager?它极大地简化了您的工作并确保您的工作完成。从您线程的run 函数中,我看到您尝试进行备份,这就是WorkManager 存在的原因(不仅如此!)developer.android.com/topic/libraries/architecture/workmanager
  • 这段代码不起作用,因为 Activity 可能不一样,因此不会初始化 Thread 变量。这里的正确答案是要么让服务拥有线程,要么使用 WorkManager 之类的东西。如果这些都不起作用,你可以破解一些东西,比如将它保存在某个全局变量中,但实际上前两个中的一个是你最好的选择。
  • 另外,你的代码是错误的。如果BackupThread 扩展了Thread,则无需执行new Thread(new BackupThread())。它只是 thread = new BackupThread()。另一个可能是因为 Thread 实现了 Runnable,但它不是应该如何使用的。
  • 我已按照您的建议更改了代码。对于我最初的问题,我将调查 workmanager。谢谢

标签: android java-threads android-threading


【解决方案1】:

准确地说,

Thread.isAlive() 如果线程已启动(可能尚未运行)但尚未完成其运行方法,则返回 true。

Thread.getState() 返回线程的确切状态。

【讨论】:

  • thread.getState() == Thead.State.NEW 也再次开始相同的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2020-01-11
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多