Выполнение сетевых вызовов в Android в ответ на событие пользовательского интерфейса - PullRequest
0 голосов
/ 24 августа 2018

Я создаю приложение для Android, которое должно выполнять определенные сетевые вызовы в ответ на события пользовательского интерфейса. Однако я изо всех сил пытаюсь найти элегантный способ отправки этих вызовов из обратного вызова пользовательского интерфейса. AsyncTask не очень подходит, потому что все, что я хочу сделать, это просто отправить вызов - любые ответы будут обрабатываться обратными вызовами в моем коде получателя. Аналогично, создание нового потока только для выполнения одного сетевого вызова кажется расточительным и плохой практикой, особенно учитывая, что в определенных случаях будет много, много вызовов в секунду, когда пользователь взаимодействует с пользовательским интерфейсом.

Примечание: под "сетевым вызовом" я на самом деле имею в виду отправку нескольких байтов через UDP DatagramSocket

Я думал о том, чтобы сетевой поток TX с «очередью отправки» непрерывно зацикливался, чтобы поток пользовательского интерфейса мог отправлять сообщения, но это казалось бы невероятной тратой циклов ЦП во времена, когда между вызовами может потребоваться несколько секунд будет сделано.

У меня такое ощущение, что элегантное решение представляет собой комбинацию вышеупомянутой идеи "зацикливания потока TX", но с объектами блокировки, поэтому оно не зацикливается, если нет новых данных для отправки - но я не очень разбираюсь в параллелизме , замки и тому подобное, так что я надеюсь, что кто-то здесь может указать мне правильное направление. Любая помощь будет принята с благодарностью. Заранее спасибо:)

1 Ответ

0 голосов
/ 24 августа 2018

Для фоновой работы вы используете 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 (), когда происходит событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...