Страница 1 из 1

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

Добавлено: 04 мар 2015, 12:22
ivannatobedev
Нужна помощь. Этот код я нашел на просторах интернета как один из основных вариантов реализации 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"
			}
		}
	}
}

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

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

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

Добавлено: 13 мар 2015, 12:31
doter.ua
А в чем вопрос собсна? Фоновый поток + интефейс. Суть интерфейса в том, что он заставляет определить метод. Когда в фоновом потоке придет ответ от сервера он просто вызовет у себя этот метод и передаст туда инфу. Грубо говоря в случае с OnClick система вызывает где-то у себя OnClick(myView) а срабатывает метод там, где его определили, т.е. там где есть new OclickListener - тот же интерфес который заставляет определить OnClick, как раз чтобы его вызвала система.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 14 мар 2015, 09:52
ivannatobedev
:) :) :) кажись дошло! Спасибо.