Android的接口回调在网络请求中的应用示例

2017-01-14 19:44:45来源:CSDN作者:jinxin_cuit人点击

来自郭霖《第一行代码》

转自:http://blog.csdn.net/u013278099/article/details/51249594


在Android中到处可见接口回调机制,尤其是UI事件处理方面。然后一般刷新ui的处理:广播,接口回调,handle或者使用eventbus或是otto,总的来说也就是个监听模式的使用吧。

回调函数解释

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

形象比喻:

下面举个通俗的例子:

比如宿舍的某个同学设置了一个闹铃,闹铃响时全宿舍的人都能听到,但是张三比较勤奋,听到铃声后起床了,李四比较懒,听到铃声后还要睡会。我们可以把闹铃发出的铃声看作是接口,张三和李四都实现了这个“接口”,闹铃到一定时间后就要“响铃”,响铃就要发出“铃声”,“铃声”就去叫人,至于人会做什么就是人本身的事情。

使用注意

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误。

回调的好处:

降低代码的耦合性,使代码更灵活、简洁

步骤一 :定义回调接口

/** * * 网络请求回调接口 */public interface HttpCallBackListener {       void onSuccess(String respose);       void onError(Exception e);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

步骤二:定义回调函数(将接口作为参数)

/** * 网络请求工具类 */public class HttpUtil {    public static void requestData(final String urlStr, final HttpCallBackListener listener) {        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                try {                    URL url = new URL(urlStr);                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    connection.setDoInput(true);                    connection.setDoOutput(true);                    InputStream in = connection.getInputStream();                    BufferedReader br = new BufferedReader(new InputStreamReader(in));                    StringBuilder sb = new StringBuilder();                    String line;                    while ((line = br.readLine()) != null) {                        sb.append(line);                    }                    if (listener != null) {                        //回调onFinish方法                        listener.onSuccess(sb.toString());                    }                } catch (Exception e) {                    if (listener != null) {                        //回调onError方法                        listener.onError(e);                    }                } finally {                    if (connection != null) {                        connection.disconnect();                    }                }            }        }).start();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

步骤三:使用回调方法一

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        HttpUtil.requestData("请求的网址", new HttpCallBackListener() {            @Override            public void onSuccess(String respose) {                //处理请求            }            @Override            public void onError(Exception e) {                //处理异常            }        });    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

步骤三:使用回调方法二

public class MainActivity extends AppCompatActivity implements HttpCallBackListener {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        HttpUtil.requestData("请求的网址", this);    }    @Override    public void onSuccess(String respose) {        //处理请求    }    @Override    public void onError(Exception e) {        //处理异常    }}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台