服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 编写简易Android天气应用的代码示例

编写简易Android天气应用的代码示例

2021-06-17 15:18喝醉的毛毛虫 Android

这篇文章主要介绍了编写简易Android天气应用的代码示例,文中的例子主要是利用到了RxAndroid处理异步方法,需要的朋友可以参考下

本文所要介绍的简易天气app主要用rxandroid、mvp、retrofit实现,首先来看看效果:
主页内容:

编写简易Android天气应用的代码示例

右侧栏天气列表:

编写简易Android天气应用的代码示例

左侧栏城市列表

编写简易Android天气应用的代码示例

首先看看activity主要代码(使用mvp模式):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//调用presenter的方法获取数据
mmainpresenter = new mainpresenterimpl(this);
mmainpresenter.getplacedata();
mmainpresenter.getweatherdata("成都");
 
//显示主页和右侧栏天气数据
public void setupweatherdata(weatherresponse weatherresponse) {
  if (weatherresponse == null) return;
  settitletext(dateutils.getweekday(weatherresponse.date));
  if (weatherresponse.results != null && weatherresponse.results.size() > 0) {
    weatherresult result = weatherresponse.results.get(0);
    mtvcity.settext(getstring(r.string.city, result.currentcity));
    mtvpm25.settext(getstring(r.string.pm25, result.pm25));
 
    mweatherdataadapter.setdata(result.weather_data);
    mweatherdataadapter.notifydatasetchanged();
 
    mweatherextraadapter.setdata(result.index);
    mweatherextraadapter.notifydatasetchanged();
  }
}
 
//显示左侧栏城市列表
@override
public void setupplacedata(list<place> placelist) {
  if (placelist == null) {
    return;
  }
  mplaceadapter.setdata(placelist);
  mplaceadapter.notifydatasetchanged();
}

接下来看看如何在presenter中应用rxjava、rxandroid获取数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//获取天气数据
@override
public void getweatherdata(string place) {
  if (textutils.isempty(place)) {
    return;
  }
  mmainview.showprogress();
  servicemanager.getinstance().getapiservice().getweatherinfo(place, constants.baidu_ak)
      .subscribeon(schedulers.io())
      .observeon(androidschedulers.mainthread())
      .subscribe(new subscriber<weatherresponse>() {
        @override
        public void oncompleted() {
          log.e(tag, "oncompleted");
          mmainview.hideprogress();
        }
 
        @override
        public void onerror(throwable e) {
          log.e(tag, e.getmessage(), e);
          mmainview.hideprogress();
        }
 
        @override
        public void onnext(weatherresponse weatherresponse) {
          mmainview.setupweatherdata(weatherresponse);
        }
      });
}
 
public interface apiservice {
 
  /*@get("service/getipinfo.php")
  call<getipinforesponse> getipinfo(@query("ip") string ip);*/
 
  @get("service/getipinfo.php")
  observable<getipinforesponse> getipinfo(@query("ip") string ip);
 
 
  //http://api.map.baidu.com/telematics/v3/weather?location=%e6%88%90%e9%83%bd&output=json&ak=mpdgj92wuyvrmyaudqs1xwcf
  @get("/telematics/v3/weather?output=json")
  observable<weatherresponse> getweatherinfo(@query("location") string location, @query("ak") string ak);
}

如上所述,我们通过百度api获取天气数据使用的是retrofit框架,它能自动的返回observable对象。
那么我们如何通过rxjava获取本地文件中的城市列表呢?(为了方便演示,我将城市列表作为一个json字符串放于文件中)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@override
public void getplacedata() {
  placerepository repository = new placerepository();
  repository.getplacelist(baseapplication.getinstance())
      .subscribeon(schedulers.io())
      .observeon(androidschedulers.mainthread())
      .subscribe(new subscriber<list<place>>() {
        @override
        public void onnext(list<place> places) {
          mmainview.setupplacedata(places);
        }
 
        @override
        public void oncompleted() {
 
        }
 
        @override
        public void onerror(throwable e) {
 
        }
      });
}
 
public class placerepository {
 
  public observable<list<place>> getplacelist(final context context) {
    return observable.create(new observable.onsubscribe<list<place>>() {
      @override
      public void call(subscriber<? super list<place>> subscriber) {
        try {
          assetmanager assertmanager = context.getassets();
          inputstream inputstream = assertmanager.open("place");
          bytearrayoutputstream outstream = new bytearrayoutputstream();
          byte[] data = new byte[1024];
          int count = -1;
          while((count = inputstream.read(data,0, 1024)) != -1) {
            outstream.write(data, 0, count);
          }
          string json = new string(outstream.tobytearray(),"utf-8");
          gson gson = new gsonbuilder().create();
          list<place> placelist = gson.fromjson(json, new typetoken<list<place>>() {}.gettype());
          subscriber.onnext(placelist);
        } catch (exception e) {
          subscriber.onerror(e);
        }
        subscriber.oncompleted();
      }
    });
  }
}

通过上述代码,我们就能完成界面所示功能了,是不是省去了handler callback,new thread()这些操作了,这就为什么说rxjava是用来解决callback hell的。

 ”在activity中分别调用了获取天气数据和城市列表的方法,那么问题来了,如果取数据的时候显示了process dialog, 我该在什么时候结束呢,写flag判断?“

     最直接的最暴力的方法就是直接在一个方法里同步调用两个接口,那使用rxjava怎么实现呢?

     这个问题可以使用rxjava的merge操作符实现,故名思议就是将两个接口observable合成一个,废话不说直接上代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@override
public void getplaceandweatherdata(string place) {
  mmainview.showprogress();
  placerepository repository = new placerepository();
  context context = baseapplication.getinstance();
  observable placeobservable = repository.getplacelist(context);
  observable weatherobservable = servicemanager.getinstance().getapiservice().getweatherinfo(place, constants.baidu_ak);
  observable.merge(placeobservable, weatherobservable)
      .subscribeon(schedulers.io())
      .observeon(androidschedulers.mainthread())
      .subscribe(new subscriber<object>() {
        @override
        public void oncompleted() {
          mmainview.hideprogress();
        }
 
        @override
        public void onerror(throwable e) {
          mlogger.error(e.getmessage(), e);
          mmainview.hideprogress();
        }
 
        @override
        public void onnext(object obj) {
          if (obj instanceof list) {
            mmainview.setupplacedata((list<place>) obj);
          } else if (obj instanceof weatherresponse) {
            mmainview.setupweatherdata((weatherresponse) obj);
          }
        }
      });
}


这样就很巧妙的解决了如果取数据的时候显示process dialog、该在什么时候结束、写flag判断的问题。

如果这样的代码看着还不舒服,你完全可以使用lambda,这样可以让代码看起来少之又少,不过android studio目前还不支持lambda,如果想要使用请安装插件retrolambda 并且jdk 使用jdk 8以上版本.

github源码地址:https://github.com/mickyliu945/commonproj

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02