您的位置:首页 > 移动开发 > Android开发

android中的回调-接口回调

2016-03-21 17:28 411 查看
发现很多初学者对于回调,接口,抽象 等概念理解的不是很透彻。

今天就以我的经验把 接口回调给大家阐述一下。适合初学者看看。

先简单说说我的理解吧,

所谓的接口回调。

你先将接口定义好,然后在特定的条件下条用它。 可能很多初学者开始的时候很疑惑,其实这也东西你天天都在用。比如你点击一按钮,你会很自觉地 设置他的监听器(onclick事件),去实现他的onclick 方法 。

1,当用户发出这个onclick 事件(用户点击按钮等)。

2,系统调用你设置的监听器(设置的onclickListener)。

3,根据你的实现产生不同的结果(在onclick中实现的代码)。

下面我们就以 android 中从网络获取json 数据为例 为大家详细说下 什么事所谓的接口回调

对于android 我们首先 先了解几个概念。

1,android 不允许在主线程中(Main thread)返回网络 长时间 的I/O操作 一些耗时的操作(这个很好理解了,就是要给用户一个友好的体验,所以不能阻塞UI)

2,子线程中不能操作UI组件(也就是在子线程中不能直接给textview imageview listview 赋值 等操作 )

3,因此我们通过线程通信来完成 上面所说的操作(thread + handler 或者 通过AsyncTask 来完成我们的操作)

我选用 thread + headler 来完成这个操作 (AsyncTask 是 谷歌 封装了 thread+ handler 的操作)

1,首选我们先定义接口 别问 为什么 ,如果问 我会 告诉你为了通用编程 (或者说将变化的东西封装起来 ,就是把你从网络获取数据的这一步骤 给封装了一下,但是获取数据后 会有各种各样的操作了,那你怎么操作我就管不了了,就是所谓通用编程,如果还是懂。那就先这样吧!)

定义接口我们可以思考一下需要哪些回调。

a, 访问网络的 成功一个 ,失败一个。这个两个非常必须,通常还会有其他的 (开始调用一个,加载中一个可以设置访问的进度)

简单写个接口如下:

/**
* 网络请求监听接口
* @author cyl
* email:670654904@qq.com
* 2016年2月27日
*/
public interface CylNetListener{
/**
* 开始加载
*/
public void start();
/**
* 加载失败
* @param code  访问网络的状态码
* @param msg   错误异常信息
*/
public void onError(int code,String msg);
/**
* 加载成功
* @param content
*/
public void onSuccess(String content);
}


2,下面的是核心的实现类

package com.cyl.callbactest.network;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.Handler;
import android.os.Message;
import com.cyl.callbactest.service.CylNetListener;
/**
*
* @author cyl
* @email 670654904@qq.com
* 2016年3月21日
*/
public class CylNetWork {
private CylNetListener listener;
/**
* 开始访问
*/
public final static int startCode = 100;
/**
* 错误
*/
public final static int onEorrorCode = 101;
/**
* 得到数据
*/
public final static int onSuccessCode = 102;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case startCode:
if(listener != null){
listener.start();
}
break;
case onEorrorCode:
if(listener != null){
listener.onError(msg.arg1, (String)msg.obj);
}
break;

case onSuccessCode:
if(listener != null){
if(listener != null){
listener.onSuccess((String)msg.obj);
}
}
break;
default:
break;
}
}
};
/**
* 网路访问
* @param url 要访问的地址
*/
public void request(final String url){
//这里是简单写的 只对http  协议简单判断了一下
if(!url.contains("http")){
Message msg = Message.obtain();
msg.what = onEorrorCode;
msg.arg1 = 404;
msg.obj = "不是http协议";
handler.sendMessage(msg);
return;
}
//程序更好的  运行  这里  的线程通过线程池 进行管理
new Thread(new Runnable() {
@Override
public void run() {
int code = 404;
try {
handler.sendEmptyMessage(startCode);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
code = connection.getResponseCode();
//可以connection 进行各种设置 超时  ,代理 啊  添加header啊  等   这里就不多写了
if(code == 200){
//这里直接对这个  流 进行了装饰  容易读取  数据
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String line = null;
StringBuffer buffer = new StringBuffer();
while ((line = reader.readLine())!=null) {
buffer.append(line);
}
reader.close();
//到这里 已经读取了  我们所需要的信息  如  json啊   xml 啊 (范例写的是  String 字符串类型的数据    文件 不适用)
Message msg = Message.obtain();
msg.what = onSuccessCode;
msg.obj = buffer.toString();
handler.sendMessage(msg);
}
} catch (Exception e) {
//这里抛出异常 也是错误的情况  要对异常 进行处理
Message msg = Message.obtain();
msg.what = onEorrorCode;
msg.arg1 = code;
msg.obj = e.getMessage();
handler.sendMessage(msg);
}
}
}).start();
}
/**
* 设置回调接口
* 当  开始  失败 成功的时候 回调这个接口
* 看见这个东西   应该很熟悉了吧
* @param listener
*/
public void setOnCylNetWorkListener(CylNetListener listener){
this.listener = listener;
}
}




2,点击test 我们既可以从 网络获取 数据了 结果如下 :



搞定。。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 接口回调