【问题标题】:Update UI in Java ThreadPool在 Java 线程池中更新 UI
【发布时间】:2014-01-14 20:54:27
【问题描述】:

我同时进行一些网络请求,并在 Android 中使用 HTTPClient 获取响应。我正在使用 threadsafeclientconnmanager 以获得线程安全连接。

为了同时进行,我使用 Java ThreadPool。

private enum STATE { state1, state2, state3 };

ExecutorService executor = Executors.newFixedThreadPool(nThreads);

并提交 3 个可运行文件:

executor.submit(new Processor(state1));
executor.submit(new Processor(state2));
executor.submit(new Processor(state3));

还有这个扩展可运行的处理器类:

class Processor implements Runnable {

    private STATE state;

    public Processor(STATE state) {
        this.state = state;
    }

    @Override
    public void run() {
        switch (state) {
        case state1:
            // Do something
            // Call Back to update UI
            break;
        case state2:
            // Do something
            // Call Back to update UI
            break;
        case state3:
            // Do something
            // Call Back to update UI
            break;
        }
        latch.countDown();
    }
}

正如您在 run 方法中看到的,对于每个状态,我都会执行一些指令,然后我需要 update UI using callBack methods

因为这是 UI 线程,所以每个回调方法都应该是:

runOnUiThread(new Runnable() {
     @Override
     public void run() {
        //Update UI
     }
});

当我们在 Android 中拥有 Java 线程池时,是否有更好的解决方案来更新 UI?

【问题讨论】:

  • 您在寻找什么样的“更好”?
  • 我正在寻找基于 Android 主 UI 线程策略的 Android 解决方案。例如:Communicating with the UI Thread
  • AsyncTask 可能是您想要的,请参阅 Miguel 的回答。您可以在任何您想要的 Executor 上执行 AsyncTasks(您的固定 ThreadPool 或 AsyncTask.THREAD_POOL_EXECUTOR 可能是不错的选择),并将您的代码放在正确的方法中将使其在正确的线程上执行。
  • 据我了解,there is a limitation for AsyncTask based on core pool size,我在使用Java线程池时不会有这个限制。

标签: java android multithreading threadpool


【解决方案1】:

您应该在其他线程中执行网络连接,而不是在主 UI 线程中。当您有新数据时,您将其从网络线程发送到主线程。

您可以使用 AsyncTask 或 Handler。

http://developer.android.com/reference/android/os/AsyncTask.html

https://developer.android.com/training/multiple-threads/communicate-ui.html

Asynctask 具有“updatePublish”将数据发送到 UI 线程。 Handler 是一个消息系统,用于向 UI Thread 发送数据,反之亦然

我认为 Handler 对你来说是更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2011-04-14
    • 2013-04-19
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多