Необычная реализация интерфейса

Ответить
Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Необычная реализация интерфейса

Сообщение ivannatobedev » 04 мар 2015, 12:22

Нужна помощь. Этот код я нашел на просторах интернета как один из основных вариантов реализации callback для работы с сокетом в мультипоточном приложении. Суть какова: посылается запрос на сервер (из мэин потока в свой поток, в котором реализован сокет), при этом приложение работает как обычно. И когда от сервера приходи ответ на запрос (а данные приходят не сразу а с задержкой, время которой не известно и ограничено константой таймаута) должен выполниться обределенный код в мэйн потоке (к примеру запись данных в бд и вывод их во вью). Запросов на сервер много и посылаются разными методами (в onCreate(), по таймеру, по экшену), и ответы соответственно на них разные и обработка их тоже индивидуальная. Оригинал взят отсюда - http://stackoverflow.com/questions/3398 ... in-android . Код ниже это уже измененный мной. Все работает. Но я не понимаю КАК оно работает. Знающие люди объясните пожалуйста как это работает. И если можно ваши варианты решения данного вопроса в андроиде. Спасибо)

Код: Выделить всё


public interface Callback{					// интерфейс обратной связи
	void doCallback(String i);
}

////////////////////////////////////

public class Worker{						//	класс в котором будет выполнятся процедура обработки данных с неизвестным временем выполнения
	Callback callbackVar;
	String workString;
	
	public void myMethod(String str){
		this.callbackVar.doCallback(str);
	}
	
	public void toDo{						//	это та самая процедура
		this.workString = "here is new data";
		this.myMethod(workString);
	}
}

//////////////////////////////////////

public class MyClass{						//	основной класс в котором вы работаете
	Worker worker = new Worker();
	String sendData, receivedData;					//	ну тут все ясно
	
	public void toSend(String str){					//	процедура, которая засылает данные на длительную обработку в класс Worker
		//code here to send some data somewhere
	}
	
	public void myTask(){						//	наша основная процедура
		this.sendData = "data to send";
		this.toSend(sendData);					//	посылаем данные..
		this.worker.myMethod = new Callback(){			//	эта штука сработает после того, как сработает "та самая процедура" в классе Worker
			@Override
			doCallback(final String dataCallback){
				this.receivedData = dataCallback;	//	=> receivedData = "here is new data"
			}
		}
	}
}

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: Необычная реализация интерфейса

Сообщение ivannatobedev » 13 мар 2015, 12:16

Неужели такой неинтересный вопрос...? На вопросы которые гуглятся в два клика 100500 ответов...А там где подумать нужно ни одного..обидно, товарисчи(

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Необычная реализация интерфейса

Сообщение doter.ua » 13 мар 2015, 12:31

А в чем вопрос собсна? Фоновый поток + интефейс. Суть интерфейса в том, что он заставляет определить метод. Когда в фоновом потоке придет ответ от сервера он просто вызовет у себя этот метод и передаст туда инфу. Грубо говоря в случае с OnClick система вызывает где-то у себя OnClick(myView) а срабатывает метод там, где его определили, т.е. там где есть new OclickListener - тот же интерфес который заставляет определить OnClick, как раз чтобы его вызвала система.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: Необычная реализация интерфейса

Сообщение ivannatobedev » 13 мар 2015, 14:44

Просто не совсем укладывется такая реализация в голове (я еще новичек). В фоне мы создаем переменную типа интерфейса, у нее вызываем метод интерфеса и туда передаем данные. а в мэйн потоке мы вызываем этоу штку и в нее передаем объект интерфейса...

Код: Выделить всё

this.worker.myMethod = new Callback(){
- вот эта строчка мне не понятна, если быть точнее.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Необычная реализация интерфейса

Сообщение doter.ua » 13 мар 2015, 15:42

ivannatobedev писал(а):Просто не совсем укладывется такая реализация в голове (я еще новичек). В фоне мы создаем переменную типа интерфейса, у нее вызываем метод интерфеса и туда передаем данные. а в мэйн потоке мы вызываем этоу штку и в нее передаем объект интерфейса...

Код: Выделить всё

this.worker.myMethod = new Callback(){
- вот эта строчка мне не понятна, если быть точнее.
Загугли "java интерфес"

Код: Выделить всё

public interface Callback{                    // интерфейс обратной связи 
    void doCallback(String i); 
} 
new Callback() это как implements Callback, только метод определяется для this.worker.myMethod, а не для всего класса.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: Необычная реализация интерфейса

Сообщение ivannatobedev » 14 мар 2015, 09:52

:) :) :) кажись дошло! Спасибо.

Ответить