响应UI事件在Android中进行网络通话

时间:2018-08-24 14:20:23

标签: java android multithreading networking

我正在构建一个Android应用程序,该应用程序需要响应UI事件进行某些网络调用。不过,我正在努力寻找一种优雅的方法来从UI回调中发送这些调用。 AsyncTask并不是一个很好的选择,因为我要做的只是发出呼叫-任何响应响应都将由接收方代码中的回调处理。同样,产生一个新线程来执行一个网络调用似乎是浪费和不好的做法,尤其是考虑到在某些情况下,当用户与UI交互时,每秒将有很多调用。

注意:“网络通话”的真正含义是通过UDP DatagramSocket发送一些字节

我考虑过让一个带有“发送队列”的网络TX线程连续循环,UI线程可以将消息发送到该线程,但是在需要两次调用之间可能需要几秒钟的时间,这似乎是对CPU周期的极大浪费。要做。

我觉得优雅的解决方案是上述“循环TX线程”思想的结合,但是具有锁定对象,因此除非有新数据要发送,否则它不会循环-但是我对并发性不是很熟练,锁等之类的东西,所以我希望这里的人可以指向正确的方向。任何帮助将不胜感激。在此先感谢:)

1 个答案:

答案 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()。