当前位置: 首页 > 知识库问答 >
问题:

异步任务与记忆可观测性

张权
2023-03-14

我有以下类和内部“AsyncTask”(http://developer.android.com/reference/android/os/AsyncTask.html)定义。

class SomeClassA {

    Long b = 0;

    void executeTask() {
       // executed on main thread.
       b = 1;
       new SomeAsyncTask().execute();
    }

    private class SomeAsyncTask extends AsyncTask<Void, Void, Void> {

        protected Void doInBackground(Void... params) {
           b = 3;
        }

        protected void onPostExecute(Void param) {
           System.out.println(b);
        }
    }
}

我很好奇,对于异步任务的“内存可见性”以及线程安全,我得到了什么样的保证。根据我的理解,调用“doInBackground”是在一个单独的线程中执行的,因此我对“doInBackground”中的“b”所做的任何更改都不能保证在主线程上执行的任何回调中“可见”(例如“onPostExecute()”、“onPreExecute”、“onProgressUpdate”等)。

这样做正确吗?所以在上面的例子中,“onPostExecute”中的“System.out.println(b)”可以打印1或3,但不能保证。我要怎么做才能保证这种记忆的可观察性?

在AsyncTask网站(发布在上面)中,我看到了以下代码片段。

记忆可观测性

AsyncTask保证所有回调调用的同步方式确保以下操作在没有显式同步的情况下是安全的。

  • 在构造函数或onPreExecute()中设置成员字段,并在doInbackground(Params...)中引用它们。
  • 在doIn后台(参数...)中设置成员字段,并在onProgressUpdate(进度...)和onPostExecute(结果)中引用它们。

我认为这“可能”解释了我的困惑,但我不明白这意味着什么。有人能给我解释一下吗?

共有1个答案

郁明诚
2023-03-14

因此,在上面的示例中,“onPostExecute”中的“System.out.println(b)”可以打印1或3,但不能保证

这将始终打印3。(如果任务被取消,则不执行任何操作)<仅当doInBackground正确完成时,code>onPostExecute才会运行。

有人能给我解释一下吗?

本节只是告诉您,在相应的命名方法中设置的命名方法中使用成员是可以保存的。

 类似资料:
  • 使用Java的工作代码: C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理

  • 主要内容:本节引言:,1.相关概念,2.AsyncTask全解析:,3.AsyncTask使用示例:,本节小结:本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称:应用程序,进程,线程,

  • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

  • 这可能是一个更巧妙的问题,但我在ViewComponent类中有以下方法 所以我的问题是我应该采取什么方法?让异步在那里与警告无关,还是有一个解决方案/修复这个警告?它对我的项目有那么大的影响吗? 谢了!

  • 8.2 使用异步任务 注意:本节所介绍的功能要求 vim 编译包括 +job 特性。 8.2.1 简单任务体验 前文说到,Vim 的异步任务主要是针对外部命令的。那我们就先以最简单最常见的系统命 令 ls 为例,其功能是列出当前目录下的文件,若在 Windows 操作系统下或可用 dir 命令代替。 首先请在 shell 中进入一个非空目录,便于实践,并在 shell 中执行如下命令: $ ls

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,