代码之家  ›  专栏  ›  技术社区  ›  Hafnernuss

等待同步回调?

  •  0
  • Hafnernuss  · 技术社区  · 6 年前

    假设我有以下代码:

    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 方法和等待 “标记3” 日志打印,但如我所料,我被卡住了,因为显然回调与等待的回调在同一线程中运行。

    我很感谢您可能有任何提示或解决方案;)

    1 回复  |  直到 5 年前
        1
  •  0
  •   Esperanz0    5 年前

    您应该阅读异步编程及其工作原理。

    例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,您可以手动订阅/观察。

    注意:这只是伪代码,并显示了如何完成。

    推荐文章