【问题标题】:AsyncTask check MainActivity for variable set before ending doInBackground [duplicate]AsyncTask 在结束 doInBackground 之前检查 MainActivity 的变量集 [重复]
【发布时间】:2020-04-09 13:39:31
【问题描述】:

我想在 MainActivity 创建的 AsyncTask 在后台运行时检查 MainActivity 中的变量,然后在此变量设置为某个值时结束 AsyncTask,假设为 true;

主活动

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        new MyTask(this).execute();
    }

我的任务


public class MyTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... ignore)
    {
      //check for MainActivity variable then exit or PostExecute when this variable is set to true?
    }

}

【问题讨论】:

标签: java android android-asynctask


【解决方案1】:

假设 Android 在这方面类似于普通的 Java 线程和可运行对象,我假设您可以在主线程 (MainActivity.java) 中创建一个原子变量,然后在 AsyncTask 中检查它。

例如

private final AtomicInteger myInt = new AtomicInteger(whatever value you need);

public int getMyInt() {
     return myInt.get();
}

然后只需获取价值并用它做你想做的事。您还可以编写方法来修改它或您想做的任何其他事情。 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html

否则,如果您需要传递对象,则必须研究同步,您可以通过谷歌搜索找到一些不错的文章。

编辑:要实现,您可以将 AtomicInteger 和方法设为静态,然后只需调用该方法即可获取整数的值。

例如

private final static AtomicInteger myInt = new AtomicInteger(whatever value you need);

public static int getMyInt() {
     return myInt.get();
}

然后在你的 AsyncTask 中:

public void doInBackground() {
     if(MainActivity.getMyInt() == some value) {
          //do something with it
     }
}

【讨论】:

  • 谢谢,但是我如何在 AsyncTask 中专门在 doinBackground 中调用 getMyInt()?
  • 您可以很容易地为此使用 volatile 变量。如果您使用 AtomicInteger,最好将其设为 final。
  • @Ryan M 好点,我在写这篇文章时忘记了这一点。是的,volatile 会起作用,但如果他试图做一个计数器或其他东西,我认为 AtomicInteger 的功能会更好。
  • @Nathan Stark 谢谢,它也适用于静态和方法。我还没有使用 AtomicBoolean 对其进行彻底测试,但一旦一切正常,我就会回到这一点。我现在将对此进行投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多