Ждать синхронного обратного вызова?
Предположим, у меня есть следующий код:
private void getResource(String mac, String resource) {
int threadID = android.os.Process.myTid();
Log.e( "", "Marker 1" );
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
Log.e( "", "Marker 2" );
int callbackTID = android.os.Process.myTid();
if( callbackTID == threadID) {
Log.e("", "Same Thread");
}
else{
Log.e("", "Different Thread");
}
}
});
Log.e( "", "Marker 3" );
}
Похоже, что обратный вызов, который я указал в new MdsResponseListener
выполняется в том же потоке, который сделал общий вызов функции get(...)
, так как threadID
а также callbackTID
идентичны
Тем не менее, журнал ясно показывает, что "Marker 3"
печатается раньше "Marker 2"
что, насколько я понимаю, говорит мне, что это асинхронный обратный вызов в конце концов. Как это может быть? Я совершенно новичок в Java (и Android), так что, возможно, я пропускаю некоторые важные базовые знания здесь.
Как можно реализовать метод ожидания обратного вызова? Я попробовал это с CoundDownLatch
который просто считает в onSuccess
метод и ждет до "Marker 3"
Печать журнала, но, как я и ожидал, я застрял, потому что, по-видимому, обратный вызов выполняется в том же потоке, что и ожидающий.
Я благодарен за любые подсказки или решения, которые вы можете иметь;)
0 ответов
Вы должны прочитать об асинхронном программировании и о том, как оно работает.
Пример 1:
Log.e( "", "Marker 1" );
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
Log.e( "", "Marker 2" );
doSomething() // Your method call when response is ready
});
private void doSomething() {
Log.e( "", "Marker 3" );
}
}
Пример 2 ( RxJava)
Obserable.create( source ->
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
source.onNext(data)
source.onComplete()
});
)
Затем подпишитесь на это наблюдаемое, и вы можете манипулировать его подпиской / наблюдением.
ПРИМЕЧАНИЕ. Это только псевдокод, показывающий, как это можно сделать.