等待同步回调?

时间:2018-07-01 16:26:13

标签: java android movesense

假设我有以下代码:

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和{ {1}}完全相同。

但是,日志清楚地表明,callbackTID是在之前 "Marker 3"打印的,据我所知,这毕竟是异步回调。怎么会这样?我对Java(和android)非常陌生,所以也许我在这里缺少一些关键的基础知识。

如何实现一种等待回调的方法?我用"Marker 2"进行了尝试,该方法只是在CoundDownLatch方法中递减并在onSuccess日志打印之前等待,但是正如我期望的那样,我卡住了,因为显然回调在与正在等待的线程相同。

感谢您可能提供的任何提示或解决方案;)

1 个答案:

答案 0 :(得分: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()
  });
)

然后订阅此可观察的内容,然后您就可以操作subscribeOn / observeOn。

  

注意:这只是伪代码,显示了如何实现。