我试图理解回调处理程序的机制。 handle()方法是如何调用的?任何人都可以举例说明在非Swing应用程序中使用自定义回调处理程序(除了JASS的登录模块中使用的那些)吗?
答案 0 :(得分:9)
定义一个处理回调的接口。
public interface ServiceListener<T> {
void callback(T result);
}
定义一个将ServiceListener作为参数并返回void的方法。
Public void runInBackground(ServiceListener listener) {
...code that runs in the background...
listener.callback(...data to return to caller...);
}
现在您可以从主代码中执行此操作:
runInBackground(new ServiceListener() {
@Override
public void callback(..returned data...) {
...Do stuff with returned data...
}
});
答案 1 :(得分:3)
这是使用Android应用程序中的AsyncTask从Web服务器请求数据的基本示例。
首先定义异步类。请注意,构造函数使用一个侦听器,我们使用它来准备好一旦发布结果。
public class Webservice extends AsyncTask<String, Void, String> {
private DialogListener dialogListener;
public Webservice(final DialogListener dialogListener) {
this.dialogListener = dialogListener;
}
@Override
protected String doInBackground(final String... strings) {
// We cant trigger onComplete here as we are not on the GUI thread!
return "";
}
protected void onPostExecute(final String result) {
dialogListener.onComplete(result);
}
}
用于处理各种网络通信的基本服务器类:
public class Server {
public void queryServer(final String url, final DialogListener service) {
// Simulate slow network...
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Webservice(service).execute(url);
}
}
我们现在可以在我们的活动中使用此代码,而不必担心调用需要多长时间,因为它不会因为执行异步而停止GUI。
Server s = new Server();
// Async server call.
s.queryServer("http://onto.dk/actions/searchEvents.jsp?minLatE6=55640596&minLngE6=12078516&maxLatE6=55642654&maxLngE6=12081948", new DialogListener() {
@Override
public void onComplete(final String result) {
toast("complete");
}
@Override
public void onError() {
toast("error");
}
});