响应式编程 android,响应式编程在Android编程中的应用 | 晓华开讲 - 论文助手

点击上方 “宅客在线” 关注我们 #安卓直播课# 最近在带团队做一个KTV APP项目,在研发阶段的测试都顺利通过,在上线运行期间却出现了网络请求数据不能正确返回到界面的情况

在处理复杂业务处理时,原来的service和broadcast数据交互很容易出问题

通过各种试验,最后,在通过使用响应式编程之后,在复杂的业务处理情况下,网络请求数据很顺利返回到前端(出现此问题,没有研究是不是Android本身处理能力,但是通过响应编程很容易把问题解决了)

下面我就介绍一下响应式编程在Android编程中的应用

一) RXJava的基本语法 在RXJava中,有两个对象比较重要,一个是被观察者(Observables)对象,一个是观察者(Subscribers)对象

其实,所谓响应式编程是被察者发出事件,观察者处理事件或者说响应事件

1. 被观察者的创建并发出事件 /** * 创建消息对象类,用于传递消息 * */ public class Message { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } /** * 创建被观察者对象 * */ public  ObservablegetObserve() { Message msg=new Message(); return Observable.just(msg).map(new Func1(){ @Override public Message call(Message arg0) { arg0.setMsg(“被者发出消息”); arg0.setMsg("dfasdf"); return arg0; } }) 注: 1.Observable.just(msg),是根据msg对象创建被观察者对象 2.map为操作符,对被察者对象返回的数据(这里是msg)进行转换或者说改变msg里的值,并把此数据传递给观察者对象(订阅对象)

3.Func1是在转换过程函数 4.提示:RXJava中,还有很多操作符

在这里不再介绍了

2. 创建观察者对象(订阅者) Subscription sub=getObserve().subscribe(action); 注:action为观察者执行的函数,代码如下

/** * 定义订观察者执行代码 */ Action1action = new Action1() { @Override public void call(Message arg0) { //txtContent为界面的文本框 txtContent.setText(arg0.getMsg()); } }; 3. 在android编程中中耗时操作中,通常在异步类中实现网络请求,为此RXJava中,可以设置被观察者(订阅者)和观察者运行线程,代码如下: getObserve().observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread()); 注: AndroidSchedulers.mainThread()//线程调度器 observeOn(AndroidSchedulers.mainThread())设置订阅者的运行线程

subscribeOn(Schedulers.newThread());//设置观察者运行线程

4. 总结 根据以上示例,看出通过响应式编程也能实现异步请求及处理请求返回的数据

下面是利用响应式编程的完整示例

1) 向服务器发送请求类(ModelService) public class ModelService { private Mapparams; private String actionUrl; private String BASEURL="http://10.0.2.2:8080/kdap/"; private ModelService(String uri,Mapparams) { this.actionUrl=uri; this.params=params; } public static ModelService newInstance(String uri,Mapparams) { return new ModelService(uri, params); } public static ModelService newInstance(String uri) { return new ModelService(uri, null); } private ArrayListpostParams=new ArrayList(); /*** * * 用于网络请求 * @return */ public String post() { if(params!=null) { for(String key:params.keySet()) { postParams.add(new BasicNameValuePair(key, params.get(key).toString())); } } HttpPost hp=new HttpPost(BASEURL+actionUrl); if(params!=null&&params.size()>0) { try { hp.setEntity(new UrlEncodedFormEntity(postParams,HTTP.UTF_8)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } boolean isExceed=false; DefaultHttpClient dhc=new DefaultHttpClient(); HttpResponse response=null; try { response=dhc.execute(hp); } catch (Exception e) { // TODO Auto-generated catch block isExceed=true; e.printStackTrace(); } if(isExceed) { return "{'result':'連接超時!'}"; } if(response.getStatusLine().getStatusCode()==200) { HttpEntity entity=response.getEntity(); try { return "{'result':'1','value':"+EntityUtils.toString(entity)+"}"; } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); return "{'result':'1','value':'解析异常'}"; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return "{'result':'1','value':'处理异常'}"; } } else { return "{'result':'"+response.getStatusLine().getReasonPhrase()+"'}"; } } /** * * 创建被观察者对象,同时指定被观察者执行在新线程中(异步操作需要在独立线程中操作) * * */ public  ObservablegetObserve() { Message msg=new Message(); return Observable.just(msg).map(new Func1(){ @Override public Message call(Message arg0) { //此代码执行在新线程中 System.out.println(Thread.currentThread().getName()); arg0.setMsg(post()); arg0.setMsg("dfasdf"); return arg0; } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread()); } } 2)android Acitvity单击事件处理 /*** * 定义订观察者执行代码 */ Action1action = new Action1() { @Override public void call(Message arg0) { System.out.println("dd:" + Thread.currentThread().getName()); txtContent.setText(arg0.getMsg());// 把从服务器传过来的数据显示到文本框 里 } }; Activity按钮单击事件 private OnClickListener l = new OnClickListener() { @Override public void onClick(View arg0) { Mapparams = new HashMap(); params.put("data1", "kkkk"); params.put("data2", "bbbb"); // getObserve()方法用于创建被观察者对象,同时定义观察者执行的代码(即action) ModelService.newInstance("ktpa/data.html", params) .getObserve().subscribe(action); break; } }; 点击下方“阅读原文”查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值