等待同步回调?
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(...)
进行了整体函数调用,因为 threadID
和 callbackTID
相同。
但是,日志清楚地显示 "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.
假设我有以下代码:
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"
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.