第十二课:Running in the Background(基于AndroidStudio3.2)

现在我们对UI元素和屏幕有了一些了解,我们需要让它们具有响应性。响应力并不仅仅与速度有关 - 你可以在一段时间内完成多少工作。更重要的是应用程序的速度有多快。当人们说应用程序响应时,通常他们的意思是应用程序不会阻止他们做他们正在尝试的事情去做。它不会妨碍他们。如果你曾经使用过一个只是冻结的应用程序点击某个按钮,你可以欣赏我们正在谈论的内容。它不会阻止。
想象阻止就像打电话给某人一样。拨号时,您会听到铃声和声音你等着对方接。除非对方接听,否则电话不能继续。我们可以说电话是一种阻止操作,因为事情必须发生按顺序。你拨打电话,打电话,另一个人拿起电话,然后你说话。都不是事情可能同时发生。所有步骤都涉及某种形式的“等待” - 或者计算术语,阻塞。

长期运行的任务
用户可能能够容忍日常生活中的阻塞,例如排队续订许可证或杂货,或等待某人拿起电话,等等。但在使用您的应用时,他们可能不那么宽容。即便是Android平台也不会容忍你的应用程序,如果花费太多时间做它做的事情:WindowManager和ActivityManager是响应性的警察。用户点击时一个按钮,或与任何触发事件的视图交互,您的应用程序没有很多时间来完成应该做的事情;事实上,它最多只有5秒钟被运行时杀死。到那时,你会看到臭名昭着的ANR错误(申请没有响应)。把它想象成Android的BSOD(蓝屏死机)。
根据Android指南,应用程序可以在100毫秒到200毫秒之间在事件处理程序中完成一项任务 - 这不是很多时间,所以我们确实需要确保我们不会在事件处理程序中做任何太疯狂的事情。但说起来容易做起来难,而且有几种情况我们不会完全控制我们在里面做的事情事件处理程序。我们可以在这里列出其中几个。

  • 当我们read a file时 - 我们的程序需要保存数据或读取他们在某个时间点。 文件IO操作可能是出了名的有时不可预测; 你只是不知道该文件有多大。如果它太大,完成任务可能需要200多秒
  • 当我们interact with a database时 - 我们与数据库进行交互为其提供读取,更新,创建和删除数据的命令。与文件一样,有时候,我们可能会发出一个返回大量文件的命令数据; 处理这些记录可能需要一段时间
  • 当我们 interact with the network时 - 当我们获取数据时网络套接字,我们受网络条件的支配。 如果它是没有拥挤或失望,这对我们有好处。 但它并不总是上升而且它是并不总是很快; 如果你编写处理网络内部的代码事件处理程序,您冒着ANR的风险
  • 当我们use other people’s code时 - 我们越来越依赖API构建我们的应用程序,并且有充分的理由:它们节省了我们的时间。 但我们不能总是知道这些API是如何构建的以及它们是什么类型的他们在引擎盖下的操作(你真的总是读它您使用的所有API的源代码?)

那么,我们应该怎么做才能使我们的应用程序不会遇到ANR? 我们当然无法避免前面列出的东西,因为大多数现代(和有用)应用程序将需要做一件或多件(或全部)这些事。 事实证明,答案是运行中的东西背景。 有几种方法可以做到这一点,但在本节中,我们将看看运行情况我们在AsyncTask中的代码。

一、模拟一个长时间运行的任务

当用户点击时“长时间运行任务”,它将模拟一个长时间运行的任务,但我们所做的只是从1开始计算到15; 计数的每个刻度需要2秒。 我们实际上是将用户作为人质至少30秒,在此期间他不能在应用程序中做太多其他事情。

1、新建项目Async

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="317dp"
        android:gravity="center"
        android:text="Long running task"
        app:layout_con
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值