长沙市建设网站,网约车多少钱一辆,施工企业资质等级标准,wordpress 用户登录我想添加一个信息补充#xff0c;并给出一个指向库或2的指针#xff0c;可以用于长时间运行的AsyncTask#xff0c;甚至可以用于面向网络的asynctasks。AsyncTasks专为在后台执行操作而设计。是的#xff0c;您可以使用该cancel方法停止它。当您从Internet下载内容时#…我想添加一个信息补充并给出一个指向库或2的指针可以用于长时间运行的AsyncTask甚至可以用于面向网络的asynctasks。AsyncTasks专为在后台执行操作而设计。是的您可以使用该cancel方法停止它。当您从Internet下载内容时我强烈建议您在IO阻塞状态下处理您的线程。您应按照以下方式组织下载public void download() {//get the InputStream from HttpUrlConnection or any other//network related stuffwhile( inputStream.read(buffer) ! -1 !Thread.interrupted() ) {//copy data to your destination, a file for instance}//close the stream and other resources}使用该Thread.interrupted标志将帮助您的线程正确地退出阻塞io状态。您的线程将更灵敏地调用该cancel方法。AsyncTask设计缺陷但如果您的AsyncTask持续时间过长那么您将面临两个不同的问题活动与活动生命周期密切相关如果活动中断您将无法获得AsyncTask的结果。的确是的你可以但这将是粗糙的方式。AsyncTask没有很好的文档记录。一个天真但直观的实现和使用asynctask可能很快导致内存泄漏。我想介绍的库RoboSpice使用后台服务来执行这种请求。它专为网络请求而设计。它提供了其他功能例如自动缓存请求的结果。这就是为什么AsyncTasks对于长时间运行的任务不利的原因。以下推理是对RoboSpice动机的改编适用于解释为什么使用RoboSpice满足Android平台需求的应用程序。AsyncTask和Activity生命周期AsyncTasks不遵循Activity实例的生命周期。如果在Activity中启动AsyncTask并旋转设备则将销毁Activity并创建新实例。但AsyncTask不会死。它会继续生存直到它完成。完成后AsyncTask将不会更新新Activity的UI。实际上它更新了之前不再显示的活动实例。这可能导致java.lang.IllegalArgumentException类型的异常如果您使用findViewById来检索Activity内的视图则View不会附加到窗口管理器。内存泄漏问题将AsyncTasks创建为活动的内部类非常方便。由于AsyncTask需要在任务完成或正在进行时操纵Activity的视图使用Activity的内部类似乎很方便内部类可以直接访问外部类的任何字段。然而这意味着内部类将在其外部类实例上保存一个不可见的引用Activity。从长远来看这会产生内存泄漏如果AsyncTask持续很长时间它会使活动保持“活着”而Android则希望摆脱它因为它无法再显示。该活动不能被垃圾收集这是Android在设备上保留资源的核心机制。您的任务进度将丢失您可以使用一些变通方法来创建长时间运行的异步任务并根据活动的生命周期管理其生命周期。您可以在活动的onStop方法中取消AsyncTask也可以让异步任务完成而不是松开其进度并将其重新链接到下一个活动实例。这是可能的我们展示了RobopSpice的动机但它变得复杂而且代码并不是真正的通用。此外如果用户离开活动并返回您仍将失去任务的进度。Loaders也出现了同样的问题尽管它与上面提到的重新链接解决方法的AsyncTask相比更简单。使用Android服务最好的选择是使用服务来执行长时间运行的后台任务。这正是RoboSpice提出的解决方案。同样它专为网络设计但可以扩展到非网络相关的东西。该库具有大量功能。你可以通过信息图表在不到30秒的时间内了解它。对于长时间运行的操作使用AsyncTasks确实是一个非常糟糕的主意。然而它们适用于短期生活例如在1或2秒后更新视图。我鼓励您下载RoboSpice Motivations应用程序它真正深入地解释了这一点并提供了有关网络相关内容的不同方法的示例和演示。如果您正在为非网络相关任务(例如没有缓存)寻找RoboSpice的替代方案您还可以查看Tape。