RxAndroid基本使用1
1,基本使用
public class MainActivity extends ActionBarActivity implements View.OnClickListener, View.OnTouchListener {
/**
* 天气预报API地址
*/
private static final String WEATHRE_API_URL="http://php.weather.sina.com.cn/xml.php?city=%s&password=DJOYnieT8234jlsK&day=0";
private EditText cityET; //城市
private TextView queryTV; //查询按钮
private TextView weatherTV; //天气结果
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件实例
cityET = (EditText) findViewById(R.id.city);
queryTV = (TextView) findViewById(R.id.query);
weatherTV = (TextView) findViewById(R.id.weather);
//对查询按钮侦听点击事件
queryTV.setOnClickListener(this);
weatherTV.setOnTouchListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.query){
weatherTV.setText("");
String city = cityET.getText().toString();
if(TextUtils.isEmpty(city)){
Toast.makeText(this, "城市不能为空!", Toast.LENGTH_SHORT).show();
return;
}
//采用普通写法创建Observable
observableAsNormal(city);
//采用lambda写法创建Observable
// observableAsLambda(city);
//采用普通写法创建Observable,使用map操作符转换
// observableMapAsNormal(city);
//采用lambda写法创建Observable,使用map操作符转换
// observableMapAsLambda(city);
}
}
/**
* 采用普通写法创建Observable
* @param city
*/
private void observableAsNormal(String city){
subscription = Observable.create(new Observable.OnSubscribe<Weather>() {
@Override
public void call(Subscriber<? super Weather> subscriber) {
//1.如果已经取消订阅,则直接退出
if(subscriber.isUnsubscribed()) return;
try {
//2.开网络连接请求获取天气预报,返回结果是xml格式
String weatherXml = getWeather(city);
//3.解析xml格式,返回weather实例
Weather weather = parseWeather(weatherXml);
//4.发布事件通知订阅者
subscriber.onNext(weather);
//5.事件通知完成
subscriber.onCompleted();
} catch(Exception e){
//6.出现异常,通知订阅者
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.newThread()) //让Observable运行在新线程中
.observeOn(AndroidSchedulers.mainThread()) //让subscriber运行在主线程中
.subscribe(new Subscriber<Weather>() {
@Override
public void onCompleted() {
//对应上面的第5点:subscriber.onCompleted();
//这里写事件发布完成后的处理逻辑
}
@Override
public void onError(Throwable e) {
//对应上面的第6点:subscriber.onError(e);
//这里写出现异常后的处理逻辑
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Weather weather) {
//对应上面的第4点:subscriber.onNext(weather);
//这里写获取到某一个事件通知后的处理逻辑
if(weather != null)
weatherTV.setText(weather.toString());
}
});
}
/**
* 采用lambda写法创建Observable
* @param city
*/
private void observableAsLambda(String city){
subscription = Observable.create(subscriber->{
if(subscriber.isUnsubscribed()) return;
try {
String weatherXml = getWeather(city);
Weather weather = parseWeather(weatherXml);
subscriber.onNext(weather);
subscriber.onCompleted();
} catch(Exception e){
subscriber.onError(e);
}
}
).subscribeOn(Schedulers.newThread()) //让Observable运行在新线程中
.observeOn(AndroidSchedulers.mainThread()) //让subscriber运行在主线程中
.subscribe(
weather->{
if(weather != null)
weatherTV.setText(weather.toString());
},
e->{
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
});
}
/**
* 采用普通写法创建Observable,使用map操作符转换
* @param city
*/
private void observableMapAsNormal(String city){
subscription = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
if(subscriber.isUnsubscribed()) return;
try {
String weatherXml = getWeather(city);
subscriber.onNext(weatherXml);
subscriber.onCompleted();
} catch(Exception e){
subscriber.onError(e);
}
}
}).map(new Func1<String, Weather>() { //类型的转换
@Override
public Weather call(String weatherXml) {
return parseWeather(weatherXml);
}
}).subscribeOn(Schedulers.newThread()) //让Observable运行在新线程中
.observeOn(AndroidSchedulers.mainThread()) //让subscriber运行在主线程中
.subscribe(new Subscriber<Weather>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Weather weather) {
if(weather != null)
weatherTV.setText(weather.toString());
}
});
}
/**
* 采用lambda写法创建Observable,使用map操作符转换
* @param city
*/
private void observableMapAsLambda(String city){
subscription = Observable.create(subscriber->{
if(subscriber.isUnsubscribed()) return;
try {
String weatherXml = getWeather(city);
subscriber.onNext(weatherXml);
subscriber.onCompleted();
} catch(Exception e){
subscriber.onError(e);
}
}
).map(weatherXml->parseWeather(weatherXml.toString()))
.subscribeOn(Schedulers.newThread()) //让Observable运行在新线程中
.observeOn(AndroidSchedulers.mainThread()) //让subscriber运行在主线程中
.subscribe(
weather->{
if(weather != null)
weatherTV.setText(weather.toString());
},
e->{
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
});
}
@Override
protected void onDestroy() {
//取消订阅
if(subscription != null && !subscription.isUnsubscribed())
subscription.unsubscribe();
super.onDestroy();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(v == weatherTV && event.getAction() == MotionEvent.ACTION_DOWN){
//隐藏软键盘
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View focusedView = getCurrentFocus();
if(focusedView!=null && focusedView.getWindowToken()!=null){
manager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
}
}
return true;
}
/**
* 天气情况类
*/
private class Weather{
/**
* 城市
*/
String city;
/**
* 日期
*/
String date;
/**
* 温度
*/
String temperature;
/**
* 风向
*/
String direction;
/**
* 风力
*/
String power;
/**
* 天气状况
*/
String status;
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("城市:" + city + "\r\n");
builder.append("日期:" + date + "\r\n");
builder.append("天气状况:" + status + "\r\n");
builder.append("温度:" + temperature + "\r\n");
builder.append("风向:" + direction + "\r\n");
builder.append("风力:" + power + "\r\n");
return builder.toString();
}
}
/**
* 解析xml获取天气情况
* @param weatherXml
* @return
*/
private Weather parseWeather(String weatherXml){
//采用Pull方式解析xml
StringReader reader = new StringReader(weatherXml);
XmlPullParser xmlParser = Xml.newPullParser();
Weather weather = null;
try {
xmlParser.setInput(reader);
int eventType = xmlParser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_DOCUMENT:
weather = new Weather();
break;
case XmlPullParser.START_TAG:
String nodeName = xmlParser.getName();
if("city".equals(nodeName)){
weather.city = xmlParser.nextText();
} else if("savedate_weather".equals(nodeName)){
weather.date = xmlParser.nextText();
} else if("temperature1".equals(nodeName)) {
weather.temperature = xmlParser.nextText();
} else if("temperature2".equals(nodeName)){
weather.temperature += "-" + xmlParser.nextText();
} else if("direction1".equals(nodeName)){
weather.direction = xmlParser.nextText();
} else if("power1".equals(nodeName)){
weather.power = xmlParser.nextText();
} else if("status1".equals(nodeName)){
weather.status = xmlParser.nextText();
}
break;
}
eventType = xmlParser.next();
}
return weather;
} catch(Exception e) {
e.printStackTrace();
return null;
} finally {
reader.close();
}
}
/**
* 获取指定城市的天气情况
* @param city
* @return
* @throws
*/
private String getWeather(String city) throws Exception{
BufferedReader reader = null;
HttpURLConnection connection=null;
try {
String urlString = String.format(WEATHRE_API_URL, URLEncoder.encode(city, "GBK"));
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
//连接
connection.connect();
//处理返回结果
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
StringBuffer buffer = new StringBuffer();
String line="";
while(!TextUtils.isEmpty(line = reader.readLine()))
buffer.append(line);
return buffer.toString();
} finally {
if(connection != null){
connection.disconnect();
}
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
RxAndroid基本使用1的更多相关文章
- 对rxandroid的简单理解
最近发现这个rxandroid挺火的,我就研究了一下,还真的挺不错. 首先在说之前可能很多人会和我刚刚学习的时候一样有很多疑问,如: 1:rxandroid是什么东西? 2:rxandroid能干嘛? ...
- RxAndroid/java小记
Rxandroid 作为一个在设计模式中能把MVP发挥的淋漓尽致的框架不去学习感觉真的对不起自己,然后也学点新东西吧,响应式编程,MVP观察者模式,然后使用RxAndroid使我们自己的代码更加简洁 ...
- [Android]基于RxJava、RxAndroid的EventBus实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4578699.html Github:https://gith ...
- RxJava 和 RxAndroid 五(线程调度)
对rxJava不了解的同学可以先看 RxJava 和 RxAndroid 一 (基础)RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内 ...
- RxJava 和 RxAndroid 四(RxBinding的使用)
对Rxjava不熟悉的同学可以先看我之前写的几篇文章 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid ...
- RxJava 和 RxAndroid 三(生命周期控制和内存优化)
rxjava rxandroid 赵彦军 前言:对Rxjava.Rxandroid不了解的同学可以先看看 RxJava 和 RxAndroid RxJava 和 RxAndroid 二(操作符的使用) ...
- RxJava 和 RxAndroid 二(操作符的使用)
前言:对Rx不了解的朋友可以先看我的第一篇博文 RxJava 和 RxAndroid 一 (基础),是对Rxjava的基本介绍 1.merge操作符,合并观察对象 List<String> ...
- RxJava 和 RxAndroid 一 (基础)
1.RxJava 项目地址 https://github.com/ReactiveX/RxJava 2.RxAndroid 项目地址 https://github.com/ReactiveX/R ...
- Rxjava, RxAndroid, Retrofit 等库的使用
RxJava的基本用法: 关于 unSubscribe() 的调用问题: There is no need to unsubscribe in onCompleted. Take a look at ...
- RxAndroid结合Retrofit,看看谁才是最佳拍档!
这篇博文酝酿好久了,今天终于下定决心开始写!RxAndroid和Retrofit都算是当下非常流行的Android开发框架,这两个框架光是单独使用就已经爽歪歪了,那么将RxAndroid和Retrof ...
随机推荐
- 2017-03-01 Oracle10g的安装与配置使用
今天项目中又用到了Oracle,时隔三年没有碰过Oracle,之前在做某城市公共自行车管理系统时使用的是Orace10g版本,Oracle给我最大的感觉就是安装上以后,电脑就会变得很卡,所以大家当不使 ...
- 卸载 Oracle 的 JDK
mac $ java -version java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_6 ...
- idea配置sliksvn解决无法配置1.8 format 问题
1. 2. 3. 4. 5. 6. 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦拉拉拉拉啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦 ...
- 安装requests 库
这是我见过最恶心的安装了,嘛的,以为公司网络限制.我无法上网 使用 PIP INSTALL REQUESTS .本来就一句话的时 我一直安装不成功.https://www.lfd.uci.edu/~g ...
- 仿QQ撒花特效--第三方开源--FllowerAnimation
点此下载资源 xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- 字符串数组是可以保存并输出null。只不过不好动态指定长度
java里如何输出才能让字符串数组不显示出null 2014-05-23 17:46笨妞纤霏 | 浏览 1360 次 编程语言 代码如下package testCourse; public clas ...
- javascript switch continue break 执行语句
1:switch 关键字段:switch(n).case.break.default switch(n) :n是一个表达式 或者是一变量,用来与其下的各种case进行匹配,比如:此时的day输出的是 ...
- php 数组NULL元素的批量处理
$a = array('a'=>1, 'b'=>0, 'c'=>NULL); foreach($a as $k=>$v) { // if( is_null($a[$k])) ...
- hl7中V2版本的ACK消息的构造
hl7 v2的ack消息即应答消息构造时有几个注意的地方. 首先,我们看下2个ack的例子: Send: MSH|^~\&|NIST_SENDER^^|NIST^^|NIST_RECEIVER ...
- Azure VM从ASM迁移到ARM(二)
在一中讨论了通过Azure平台的工具进行迁移的方案. 本文将讨论另外一种迁移方式.通过磁盘复制的方式,把部分VM迁移到ARM的Managed Disk模式. 一. 获得ASM中Disk的信息 在管理 ...