如何使用异步任务

2024-02-26

异步任务问题

我已经遵循了一些教程,但我仍然不清楚。这是我目前拥有的代码,代码下面有一些问题。 MainActivity 调用 SomeClassWithHTTPNeeds,然后调用 JSONParser (AsyncTask)


主要活动:

String station = SomeClassWithHTTPNeeds.getInstance().getStation(123);

一些带有HTTP需求的类:

getStation {

JSONParser = new JSONParser();
JSONObject station = parser.getJSONFromUrl("https://api....");
return JSONObject.getString("station");
}

JSONParser(AsyncTask)

protected String doInBackground(); ==> Seperate thread
protected void onPostExecute(); ==> On GUI thread

我刚在想: --- 将 HTTPRequest 放入 doInBackground() 中;

问题是我不知道如何: 让 JSONParser 将 JSONObject 返回给 getStation 方法?

我需要知道什么

=> 我应该在哪里返回 JSONObject: 在后台或执行?

=> 一旦 JSONParser 是 AsyncTask,我该如何使用它? execute() 函数会返回值吗?

=> AsyncTask ==> 这是如何工作的?是返回类型吗?

多谢!


AsyncTask 使用常见问题解答和一般说明

=> 我应该在哪里进行网络操作?我应该在哪里返回我获得的值?

一般来说,您应该在单独的线程 -> doInBackground();因为您不希望您的 UI 在网络操作花费时间时冻结。因此,您应该连接到您的服务或 .php 脚本或从内部获取数据的任何地方doInBackground()方法。然后您还可以解析那里的数据并从解析后的数据返回doInBackground()方法通过指定返回类型doInBackground()满足你的愿望,更多关于那里的内容。这onPostExecute()然后方法将收到您的返回值doInBackground()并使用 UI 来表示它们。

=> AsyncTask ==> 这是如何工作的?

一般来说,AsyncTask类看起来像这样,它只不过是一个具有 3 个不同的通用类泛型类型 https://www.tutorialspoint.com/java/java_generics.htm:

AsyncTask<Params, Progress, Result>

您可以指定参数的类型AsyncTask需要,进度指示器的类型和结果的类型(返回类型 doInBackGround())。

这是一个示例AsyncTask看起来像这样:

AsyncTask<String, Integer, Long>

我们的参数为 String 类型,进度为 Integer 类型,结果为 Long 类型(返回类型doInBackground()). 您可以对参数、进度和结果使用任何您想要的类型。

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {

 // these Strings / or String are / is the parameters of the task, that can be handed over via the excecute(params) method of AsyncTask
 protected Long doInBackground(String... params) {

    String param1 = params[0];
    String param2 = params[1];
    // and so on...
    // do something with the parameters...
    // be careful, this can easily result in a ArrayIndexOutOfBounds exception
    // if you try to access more parameters than you handed over

    long someLong;
    int someInt;

    // do something here with params
    // the params could for example contain an url and you could download stuff using this url here

    // the Integer variable is used for progress
    publishProgress(someInt);

    // once the data is downloaded (for example JSON data)
    // parse the data and return it to the onPostExecute() method
    // in this example the return data is simply a long value
    // this could also be a list of your custom-objects, ...
    return someLong;
 }

 // this is called whenever you call puhlishProgress(Integer), for example when updating a progressbar when downloading stuff
 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 // the onPostexecute method receives the return type of doInBackGround()
 protected void onPostExecute(Long result) {
     // do something with the result, for example display the received Data in a ListView
     // in this case, "result" would contain the "someLong" variable returned by doInBackground();
 }
}

=> 如何使用AsyncTask?我怎样才能“调用”它?我怎样才能“执行”它?

在这种情况下,AsyncTask 采用 String 或 String Array 作为范围调用 AsyncTask 后,它将如下所示:(指定的参数在AsyncTask的execute(param)方法中使用)。

new DownloadFilesTask().execute("Somestring"); // some String as param

请注意,此调用没有返回值,您应该使用的唯一返回值是从doInBackground(). 使用 onPostExecute() 方法一定要利用返回值。

另外要小心这行代码:(这个执行实际上会有返回值)

long myLong = new DownloadFilesTask().execute("somestring").get();

.get() 调用导致 UI 线程被阻塞(因此,如果操作时间超过几毫秒,UI 就会冻结)当 AsyncTask 正在执行时,因为执行does not发生在一个单独的线程中。如果删除对 .get() 的调用,它将异步执行。

=> 这个符号“execute(String...params)”是什么意思?

这是一种所谓的“varargs http://www.journaldev.com/1257/java-variable-arguments-or-java-varargs-explained“(变量参数)参数。为了简单起见,我只想说这意味着实际的未指定可以通过此参数传递给方法的值的数量,并且您传递给该方法的任何数量的值都将被视为该方法内的数组。因此,这个调用可能如下所示:

execute("param1");

但它也可能看起来像这样:

execute("param1", "param2");

甚至更多参数。假设我们还在谈论AsyncTask,可以通过这种方式访问​​参数doInBackground(String... params) method:

 protected Long doInBackground(String... params) {

     String str1 = params[0];
     String str2 = params[1]; // be careful here, you can easily get an ArrayOutOfBoundsException

     // do other stuff
 }

您可以在此处阅读有关 AsyncTask 的更多信息:http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/reference/android/os/AsyncTask.html

另请看一下这个 AsyncTask 示例:https://stackoverflow.com/a/9671602/1590502 https://stackoverflow.com/a/9671602/1590502

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用异步任务 的相关文章

  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • 哪个视图最亮?

    在Android中 哪个是轻量级视图 例如 View Textview Edittext 等 在某些情况下 我们需要使用视图来填充区域而不向用户显示视图 同时屏幕加载速度应该很快 您可以使用空间 android widget Space S
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 重复文本查找

    我的主要问题是试图找到一个合适的解决方案来自动转动这个 例如 d c d f d c d f d c d f d c d f 进入这个 d c d f 4 即查找彼此相邻的重复项 然后从这些重复项中制作一个较短的 循环 目前我还没有找到合适
  • 在python中评估Xpath2.0

    我有一个 XPath 表达式 如下所示 if replace p 1 text H h hello then p 1 text else if p 1 text world then p 2 text else notFound 我想显示哪
  • 这2个背包算法一样吗? (他们总是输出相同的东西吗)

    在我的代码中 假设C是容量 N是物品数量 w j 是物品j的重量 v j 是物品j的值 它与0 做同样的事情吗 1 背包算法 我一直在一些数据集上尝试我的代码 情况似乎确实如此 我想知道这一点的原因是因为我们学过的 0 1 背包算法是二维的
  • 使用串扰将多个图表与同一张表连接起来而不会相互影响

    我在下面创建了 Flexdashboard 最初在其中创建了四个数据框 然后其中三个数据帧显示为图表 dcross2 store supplier 和一个 dcross1 如表 我想要实现的是将所有这四个对象连接在一起crosstalk封装
  • 为什么在 T-SQL 中执行循环如此困难

    好的 我知道可以做到 我经常这样做 但是为什么在 T SQL 中做循环这么难 我可以想到很多原因 我想要解析查询结果集并做一些没有循环就无法完成的事情 但设置和执行循环的代码超过 20 行 我确信其他人也有类似的观点 那么为什么我们仍然没有
  • 格式化 XML 的十进制值

    我目前遇到一个问题 我们连接的系统期望接收 XML 其中包含三个格式化为小数点后一位的双精度字段 就我个人而言 我认为我们的系统应该能够以默认格式发送值 然后由其他系统根据需要格式化自己的表示形式 但可惜这似乎不是一个选项 我的基于 Jav
  • 当各个函数返回 inf 值时估计两个 gamma 函数的比率

    我正在估计两个伽玛函数的比率 两者的估计gamma x and gamma y 非常大 gt 10 300 但两者的比例应该相当小 from scipy special import gamma gamma x gamma y 不幸的是 有
  • C++ 正则表达式:哪个组匹配?

    我有一个正则表达式 其中包含通过 or 条件连接的各种子组 alpha digit 当我匹配字符串时1 a 2 我得到三个匹配项 1 a and 2 C 中有没有办法确定哪些子模式匹配 不直接 与std regex图书馆 匹配结果类负责子比
  • memcached 中的最大密钥长度和最大值大小是多少?

    我正在使用最新的 memcached 我可以知道最大密钥长度是多少 以及我们可以存储在 memcached 中的值的最大大小吗 如何将memcached与spring集成 有什么想法吗 如果你看一下source https github c
  • 参数字典包含不可为空类型的参数“id”的空条目

    我正在尝试通过以下方式从我的数据库检索数据id我的默认路由中的参数 routes MapRoute Default Route name controller action id URL with parameters new contro
  • 使用 SSL 联系 Active Directory

    我有一种根据 Active Directory 验证用户凭据的方法 我想将此方法与 SSL 结合使用 但无法使其工作 主要问题是我有一台服务器位于我们的网络之外 它称为 DMZ 吗 从那里我想联系我的活动目录 这就是我想使用 SSL 的原因
  • 导入 android.support 无法解决[重复]

    这个问题在这里已经有答案了 我收到一条错误消息 无法在该行解析 import android support import android support v4 app NotificationCompat 有没有人以前见过这个或者知道我能
  • MYSQL - 检索日期之间的时间戳

    All 我有一个 MYSQL 表 其中有一列称为时间戳 它是属于DATETIME数据类型 具有诸如 10 1 2009 3 25 08 PM 10 1 2009 3 30 05 PM 10 4 2009 3 40 01 PM 等值 我想编写
  • 使用选项“ -Xinject-code -extension ”插入 XJC+xsd+jxb 代码

    我正在尝试使用扩展程序 Xinject 代码 of xjc将一些代码添加到我生成的类中 对于以下简单的 xsd 架构
  • Pandas Dataframes.to_csv 截断长值

    Problem 我正在尝试在 python 中使用 Pandas 数据框存储大数据集 我的问题是 当我尝试将其保存到 csv 时 我的数据块被截断 如下所示 e 12 and 值1 值2 值3 值1853 值1854 解释 我需要将大量数据
  • C++/SQLite只输出一行数据

    我遇到一个问题 即我的 5 个测试行中只有一个会以 C 输出 我的代码是 include
  • Spring REST 模板 POST

    我正在使用 Spring 框架并尝试执行发布请求 我的 post 方法采用 url HttpMethod 和进入请求正文的参数 注意 network POSTRequest URL 中传递的 var URL 对于每次调用都是不同的 现在 如
  • 如何在 Kubernetes 中创建 post-init 容器?

    我正在尝试在 K8s 上创建一个 redis 集群 我需要一个 sidecar 容器来在所需数量的 redis 容器上线后创建集群 我有2个容器 redis和一辆边车 我正在运行它们statefulset有 6 个副本 我需要边车容器为每个
  • 使用 React、Redux 和 TypeScript 来更短地实现 mapDispatchToProps 的方法?

    我正在尝试找出一起使用 React Redux 和 TypeScript 时如何减少样板文件的数量 在这种情况下你可能不能 但想看看是否有人有想法 我目前有一个组件 它调度一个切换菜单的操作 在显示和隐藏菜单之间交替 为此 我定义了我的类
  • 如何使用异步任务

    异步任务问题 我已经遵循了一些教程 但我仍然不清楚 这是我目前拥有的代码 代码下面有一些问题 MainActivity 调用 SomeClassWithHTTPNeeds 然后调用 JSONParser AsyncTask 主要活动 Str