【问题标题】:Sophisticated threading in androidandroid中的复杂线程
【发布时间】:2012-10-25 04:41:15
【问题描述】:

我正在制作一个需要执行大量后台操作的应用程序。

  • 一个接一个地从 30 个相似的 JSON 中下载数据。
  • 根据用户响应更改上述下载的优先级/顺序。
  • 根据用户请求并行下载多张图片
  • 停止线程/检查线程状态等

执行上述操作的最佳类/API。我一直在使用AsyncTask,但我在某处读到它具有 10 个后台操作的默认限制,并且还超过了功能限制。

如果您能分享完成上述任务的代码,我也将不胜感激。

【问题讨论】:

    标签: android multithreading android-asynctask threadpool


    【解决方案1】:

    你想使用ThreadPools

    ThreadPool 是一组托管线程,等待并行执行一组放入队列中的已分配任务。

    Java 提供了许多管理池的方法,从简单的固定大小的池到根据工作负载动态增长以最大限度地提高效率的池。

    一个典型的模式是使用线程池来处理android 不希望你在UI 线程上执行的所有任务(例如:网络操作)。但是,大多数情况下,您的线程将需要在 UI 上发布结果——这在 UI 线程之外是被阻止的。 这就是您创建线程池的方式:

    ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
    threadExecutor.execute(new Runnable(){
        public void run(){
            //put here your network code
            //when you get the result, either use
            //view.post(new Runnable...);
            //or
            //AsynchTask
       }
    });
    

    根据您的需要,您可以有多个线程池用于不同的目的,但总的来说,对于 Android,最好将活动线程的总数保持在较低水平。

    根据您的硬件,建议每个内核 2 个线程,但这可能会因 IO 密集型(例如网络)和 CPU 密集型(例如图形)活动的比例而异。

    为了对队列中的条目进行优先级排序,我建议您创建自己的 ThreadPoolExecutor,如 http://www.javamex.com/tutorials/threads/thread_pools_queues.shtml 中一样,但改为传递 PriorityQueue:

    BlockingQueue q = new PriorityQueue<Runnable>();
    ThreadPoolExecutor ex = new ThreadPoolExecutor(4, 10, 20, TimeUnit.SECONDS, q);
    

    另见:How to implement PriorityBlockingQueue with ThreadPoolExecutor and custom tasks

    【讨论】:

    • 你能分享一段代码来重新排序线程池中的优先级吗?有没有办法可以将 ThreadPool 与 AsyncTask 绑定?
    • 如果您关心的是与 UI 交互,您的每个线程都可以向 UI 提交一个 异步线程 - 它本身就是一个 ThreadPool(但您无法控制它)。
    • 非常感谢朋友。如何根据用户响应更改线程的优先级/顺序还有一件事。
    【解决方案2】:

    是的,线程池是一个很好的解决方案。但是为什么要自己做呢?我在 sourceforge.net 上管理一个开源项目,可以帮助你开始。我也写了这篇文章作为介绍:Managing Threads in Android

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2013-10-08
      • 2011-01-02
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多