android中的回调-接口回调

发现很多初学者对于回调,接口,抽象  等概念理解的不是很透彻。

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

先简单说说我的理解吧,  

所谓的接口回调。

你先将接口定义好,然后在特定的条件下条用它。  可能很多初学者开始的时候很疑惑,其实这也东西你天天都在用。比如你点击一按钮,你会很自觉地 设置他的监听器(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:[email protected]
	 * 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 [email protected]
 * 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 我们既可以从 网络获取 数据了  结果如下 :

搞定。。。。。。。。。







猜你喜欢

转载自blog.csdn.net/tiandiyinghun/article/details/50947597