【问题标题】:How to handle several methods, doing heavy calculations?如何处理几种方法,做繁重的计算?
【发布时间】:2016-05-24 12:44:37
【问题描述】:

在我的应用程序中,我导入 gpx 和 kml 文件以在地图上显示轨迹和航点。对于这个操作,我使用了大约 5 种方法。一切正常,除非我尝试使用 exfilechoser 导入几个长的 gpx/kml 轨道。 屏幕变黑几秒钟,logcat 说:跳过帧(> 600)。 我怎样才能得到这些 UI 计算? 或者我怎么能用大约 5 种方法来使用 AsyncTask?这可能吗?

【问题讨论】:

  • 使用 AsyncTask 它将在后台运行所有进程,并且当工作完成时你会调用一个 onPostExecute 方法
  • 你必须使用线程,我想一个很好的解决方案是使用你写的 asynctask。是的,您可以使用 5 种不同的 asynctask,但请记住它们将是异步的,因此您必须研究如何处理工作数据。
  • 这可能很困难(因为他们应该在那里进行计算对齐)。也许我会想办法。感谢您的回复!

标签: android heavy-computation


【解决方案1】:

有几种方法。

  1. 异步执行计算。 Android SDK 提供Handler, IntentSevice, AsyncTask, HandlerThread 异步解决问题。顺便说一下,建议使用多线程解决繁重的计算。

  2. 让服务器进行计算。移动设备不适合计算,计算会耗电,影响应用性能。

【讨论】:

    【解决方案2】:

    通过查看您的问题,我建议您将 handler 与 java normal multi threading concept 一起使用。 我不认为Asyntask 是在后台执行长时间运行任务的好方法。

    最好在服务器端进行计算,减少移动站点的开销。

    【讨论】:

    • 感谢您的回复!我会测试它。
    【解决方案3】:

    我认为您应该使用为此目的而设计的Service。文档中说:

    服务是可以执行长时间运行的应用程序组件 后台操作。

    您应该记住在服务中创建新线程。

    注意:服务在其托管进程的主线程中运行—— 服务不创建自己的线程,也不在单独的线程中运行 过程(除非您另有说明)。这意味着,如果您的 服务将执行任何 CPU 密集型工作或阻塞操作 (如 MP3 播放或联网),你应该创建一个新线程 在服务内完成这项工作。

    【讨论】:

    • 感谢您的回复!我已经尝试通过服务解决这个问题。但是屏幕仍然变黑。我使用了服务。还是我应该使用 IntentService?但如果它应该有效,我会再试一次。
    • 你启动线程了吗?服务默认在主线程中执行。 “警告:服务在其托管进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。这意味着,如果您的服务将执行任何CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成这项工作。"
    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多