在Java线程池中更新UI
我同时执行一些网络请求,并在Android中使用HTTPClient获得响应。我正在使用threadsafeclientconnmanager以实现线程安全连接 为了同时做到这一点,我使用Java线程池在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
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线程池时,我不会有这个限制。