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, 访问网络的 成功一个 ,失败一个。这个两个非常必须,通常还会有其他的 (开始调用一个,加载中一个可以设置访问的进度)
简单写个接口如下:
2,下面的是核心的实现类
2,点击test 我们既可以从 网络获取 数据了 结果如下 :
搞定。。。。。。。。。
今天就以我的经验把 接口回调给大家阐述一下。适合初学者看看。
先简单说说我的理解吧,
所谓的接口回调。
你先将接口定义好,然后在特定的条件下条用它。 可能很多初学者开始的时候很疑惑,其实这也东西你天天都在用。比如你点击一按钮,你会很自觉地 设置他的监听器(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 我们既可以从 网络获取 数据了 结果如下 :
搞定。。。。。。。。。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories