2013-11-29 3 views
0

Я хочу написать класс, который обрабатывает все мое сетевое взаимодействие под названием NetworkManager. Таким образом, используя экземпляр этого класса, я бы что-то вроде:Лучший подход к написанию сетевого класса

NetworkManager nm = new NetworkManager(); 
... 
nm.login(username, password); 
... 

Тем не менее, то, что это лучший подход, так это сетевой администратор может сделать что-то в потоке пользовательского интерфейса, как только некоторый ответ был получен? Моделирование на события типа OnClick Я думаю, что это будет так:

nm.getPicture(new NetworkListener() { 
    @Override 
    public void run(Picture p){ 
     updateUI(p); 
    } 

Где я не уверен, как написать метод getPicture и класс NetworkListener().

Я не хочу использовать AsyncTask, потому что это означало бы, что мне придется писать код сервера в разных частях MainActivity. Я также рассматривал вещателя и слушателя, но это кажется слишком сильным для одного события.

+0

http://developer.android.com/training/basics/network-ops/connecting.html. В официальной документации рекомендуется использовать AsyncTask. Это не означает, что все сетевые коды должны быть в этой AsyncTask. Ничто не мешает вам просто делегировать ваш NetworkManager внутри AsyncTask. –

+0

Я думаю, что AsyncTask является обязательным. Затем вы можете использовать прослушиватель, чтобы сообщить своей активности/фрагменту, что операция завершена. Используйте другой метод для вызова другого события, например onLoginSuccessful, onLoginUnsuccessfull, onConnectionError и т. Д. –

+0

. Моя проблема заключается в том, что я уже использую асинхронный клиент Http (jloops). Поэтому я просто хочу иметь возможность вызывать метод на клиенте в «NetworkManager», а затем - это событие результата, чтобы вызвать какое-то взаимодействие с пользовательским интерфейсом в MainActivity. Я полагаю, что я не мог использовать jloops и сам кодировать все серверные материалы, имея каждое взаимодействие с сервером в «NetworkManager», блокирующее поток, время, а затем используя AsyncTask для каждого взаимодействия с сервером. Это довольно тяжело, но с тех пор мне понадобится отдельная AsyncTasks для всех разных серверных взаимодействий. – jamanji

ответ

1

Оформить заказ Модификация (http://square.github.io/retrofit/) может быть полезно рассмотреть для интеграции части вашего сетевого класса. Я не уверен, будет ли у вас несколько подобных вызовов, но если это так, я бы посоветовал вам применить шаблон Observer, где вы делаете вызов и ожидаете ответа асинхронно, но есть хорошая библиотека для этого, очень хорошо документирован, называется Отто (http://square.github.io/otto/).

+0

Благодарим вас за предложение, но нет ли способа сделать это с помощью дескриптора, а не прибегать к сторонней библиотеке ? – jamanji

+0

уверен, что вы можете сделать все это вручную, конечно, на шаблон Observer, вы можете просто предоставить средства для «слушателей», чтобы подписаться на события в вашем классе сети, например. addListener (YourOwnListenerInterfaceType), который добавляет в Set ... тогда всякий раз, когда вы хотите отправить сетевое событие, вы просто перебираете Listeners в своем наборе и вызываете метод, указанный вами в вашем слушателе ... классы, которые вы называете addListener, будут получить это. Дайте мне знать, что вы хотите, чтобы это было более подробно. –

+0

Я думаю, что я собираюсь использовать AsyncTask с NetworkManager, который блокирует поток для сетевых операций, поскольку много слушателей звучат сложно для того, что я пытаюсь. Одна вещь, хотя, я хочу, чтобы действия были поставлены в очередь на объект. Поэтому, если я вызываю mNetworkManager.login(), то mNetworkManager.upload() выполняет их в этом порядке. Не могли бы вы сообщить мне, что лучший способ подхода? – jamanji

Смежные вопросы