java回调机制

来源:互联网 发布:复杂网络应用于博弈 编辑:程序博客网 时间:2024/06/05 16:42

java回调机制:

详解:http://blog.csdn.net/xiaanming/article/details/17483273

http://blog.csdn.net/aigestudio/article/details/40869893

在网络请求的使用,来至:《第一行代码》

网络请求属于耗时操作,为了不出现ANR,所以需要开启线程,在线程里面去做网络请求的操作,但是线程中发起请求,服务器响应的数据就无法进行返回,因为服务器还没有来得及响应的时候,代码就执行完了。可我们怎样才能得到网络请求的结果呢?

那么遇到这种情况应该怎么办呢?其实解决方法并不难,只需要使用Java 的回调机制就可以了,下面就让我们来学习一下回调机制到底是如何使用的

定义一个接口

public interface HttpCallbackListener {    void onFinish(String response);    void onError(Exception e);}

可以看到,我们在接口中定义了两个方法,onFinish()方法表示当服务器成功响应我们请求的时候调用, onError()表示当进行网络操作出现错误的时候调用。这两个方法都带有参数,onFinish()方法中的参数代表着服务器返回的数据,而 onError()方法中的参数记录着错误的详细信息。

加入了回调接口的网络请求:

public class HttpUtil {    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                try {                    URL url = new URL(address);                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    connection.setDoInput(true);                    connection.setDoOutput(true);                    InputStream in = connection.getInputStream();                    BufferedReader reader = new BufferedReader(new                            InputStreamReader(in));                    StringBuilder response = new StringBuilder();                    String line;                    while ((line = reader.readLine()) != null) {                        response.append(line);                    }                    if (listener != null) {                        // 回调onFinish()方法                        listener.onFinish(response.toString());                    }                } catch (Exception e) {                    if (listener != null) {                        // 回调onError()方法                        listener.onError(e);                    }                } finally {                    if (connection != null) {                        connection.disconnect();                    }                }            }        }).start();    }}

我们首先给 sendHttpRequest()方法添加了一个 HttpCallbackListener参数,并在方法的内部开启了一个子线程,然后在子线程里去执行具体的网络操作。注意子线程中是无法通过return语句来返回数据的,因此这里我们将服务器响应的数据传入了 HttpCallbackListeneronFinish()方法中,如果出现了异常就将异常原因传入到 onError()方法中。现在 sendHttpRequest()方法接收两个参数了,因此我们在调用它的时候还需要将HttpCallbackListener的实例传入,如下所示:

HttpUtil.sendHttpRequest(address,new HttpCallbackListener(){    @Override    public void onFinish(String response){        // 在这里根据返回内容执行具体的逻辑        }    @Override    public void onError(Exception e){        // 在这里对异常情况进行处理        }  });

这样的话,当服务器成功响应的时候我们就可以在 onFinish()方法里对响应数据进行处理了,类似地,如果出现了异常,就可以在 onError()方法里对异常情况进行处理。如此一来,我们就巧妙地利用回调机制将响应数据成功返回给调用方了。另外需要注意的是,onFinish()方法和onError()方法最终还是在子线程中运行的,因此我们不可以在这里执行任何的 UI 操作,如果需要根据返回的结果来更新 UI,则仍然要使用异步消息处理机制,比如Handler



0 0
原创粉丝点击