自定义回调处理程序

时间:2011-07-21 15:53:35

标签: java

我试图理解回调处理程序的机制。 handle()方法是如何调用的?任何人都可以举例说明在非Swing应用程序中使用自定义回调处理程序(除了JASS的登录模块中使用的那些)吗?

2 个答案:

答案 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");
        }
    });