0

假设我有以下代码:

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"打印,根据我的理解,它告诉我这毕竟是一个异步回调。怎么会这样?我对java(和android)很陌生,所以也许我在这里遗漏了一些重要的基础知识。 "Marker 2"

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

4

1 回答 1

2

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

示例 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。

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

于 2019-01-18T08:44:52.587 回答