Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java线程池中更新UI_Java_Android_Multithreading_Threadpool - Fatal编程技术网

在Java线程池中更新UI

在Java线程池中更新UI,java,android,multithreading,threadpool,Java,Android,Multithreading,Threadpool,我同时执行一些网络请求,并在Android中使用HTTPClient获得响应。我正在使用threadsafeclientconnmanager以实现线程安全连接 为了同时做到这一点,我使用Java线程池 private enum STATE { state1, state2, state3 }; ExecutorService executor = Executors.newFixedThreadPool(nThreads); 并提交3个可运行的: executor.submit(new P

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

为了同时做到这一点,我使用Java线程池

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();
    }
}
这个处理器类扩展了runnable:

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方法中看到的,对于每个状态,我都执行一些指令,然后需要使用回调方法更新UI

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

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

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

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

您可以使用AsyncTask或Handler

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


我认为处理程序对您来说是更好的选择。

您在寻找哪种“更好的”解决方案?我正在寻找基于Android主UI线程策略的Android解决方案。例如:AsyncTask可能就是您想要的,请参见Miguel的答案。您可以在任何执行器上执行AsyncTasks(您的fixed ThreadPool或AsyncTask.THREAD\u POOL\u Executor可能是不错的选择),将代码放入正确的方法将使其在正确的线程上执行。据我所知,在使用Java线程池时,我不会有这个限制。