我正在构建一个Android应用程序,该应用程序需要响应UI事件进行某些网络调用。不过,我正在努力寻找一种优雅的方法来从UI回调中发送这些调用。 AsyncTask并不是一个很好的选择,因为我要做的只是发出呼叫-任何响应响应都将由接收方代码中的回调处理。同样,产生一个新线程来执行一个网络调用似乎是浪费和不好的做法,尤其是考虑到在某些情况下,当用户与UI交互时,每秒将有很多调用。
注意:“网络通话”的真正含义是通过UDP DatagramSocket发送一些字节
我考虑过让一个带有“发送队列”的网络TX线程连续循环,UI线程可以将消息发送到该线程,但是在需要两次调用之间可能需要几秒钟的时间,这似乎是对CPU周期的极大浪费。要做。
我觉得优雅的解决方案是上述“循环TX线程”思想的结合,但是具有锁定对象,因此除非有新数据要发送,否则它不会循环-但是我对并发性不是很熟练,锁等之类的东西,所以我希望这里的人可以指向正确的方向。任何帮助将不胜感激。在此先感谢:)
答案 0 :(得分:0)
要像这样使用ThreadPoolExecutor来加强背景工作。我为此使用专门的课程。您将可运行对象发布到执行程序。
public class RemoteConnections {
//Variables and constants to manange the threadpool
private final int KEEP_ALIVE_TIME = 1;
private final TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;
private final int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
private ThreadPoolExecutor mThreadpool;
private RemoteRepository(Application application) {
mApplication = application;
//initialize the threadpool for networking
final BlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<Runnable>();
mThreadpool = new ThreadPoolExecutor(NUMBER_OF_CORES, NUMBER_OF_CORES, KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT.SECONDS, mQueue);
}
public void loadWhatEver() {
mThreadpool.execute(new Whatever());
}
private class Whatever implements Runnable {
public Whatever(//setup whatever you need perhaps your callback listener) {
mListener = listener;
}
@Override
public void run() {
//do your downloading here
//make the callback to the listener
}
}
在活动或片段中,事件发生时只需调用remote.loadWhatEver()。