Ждать синхронного обратного вызова?

Предположим, у меня есть следующий код:

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()
  });
)

Затем подпишитесь на это наблюдаемое, и вы можете манипулировать его подпиской / наблюдением.

ПРИМЕЧАНИЕ. Это только псевдокод, показывающий, как это можно сделать.

Другие вопросы по тегам