等待同步回调?

Wait Synchronous callback?

假设我有以下代码:

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(...) 进行了整体函数调用,因为 threadIDcallbackTID 相同。

但是,日志清楚地显示 "Marker 3" 之前 "Marker 2" 打印,据我了解,这告诉我这是一个异步回调毕竟。怎么会这样?我对 java(和 android)还很陌生,所以我可能在这里遗漏了一些关键的基础知识。

如何实现一种等待回调的方法?我已经用 CoundDownLatch 尝试了它,它只是在 onSuccess 方法中倒计时并在 "Marker 3"log 打印之前等待,但正如我所料,我被卡住了,因为显然回调运行在与等待的线程相同。

您应该了解异步编程及其工作原理。

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

然后订阅这个 observable 并且你可以操作 subscribeOn / observeOn。

NOTE: This is only pseudo code and shows how it can be done.