题目:利用伟鹤师兄给的链接,加载上面的天气数据,做一个天气预报的Android软件
新知识点:1、异步加载
2、json获取与解析
3、apacheHTTP获取数据
第一次写博文,但愿能详细地写下做完任务后的感想、体会,和收获。
进工作室没多久(两天),师兄就给小任务,其实是好事,发现做完后写到不少东西,比坐在那自学更有冲劲,更有兴趣。师兄首先给我讲解了一下异步加载和JSON,一开始被他讲得有点晕,后来接受就感觉这部分蛮简单的。
简单总结下这次做天气预报用异步加载和JSON解析的体会,算是复习咯。下面就通俗地写吧,反正就只有自己看 = =。
首先写一个类继承AsyncTask<Params,Progress,Result>。Params根据优快云的某博文是指“启动任务执行的输入参数,比如URL”,想起我的确要传URL进去,这里我就写了String,Progress是后台运行的百分比,不是很懂有什么用,随便写了Integer,Result是后台执行任务最终返回的结果,因为我要返回文字信息,写了String。
然后重写里面重要的三个函数,onPreExecute()、doInBackground(Params…)、onPostExecute(Result)
第一个和第三个是在UI线程,只有第二是在异步,第二个十分重要,必须重写,获取数据的代码就写在第二个函数中。第一个是在异步加载数据前,可以在里面写一些提示或toast。第三个接收第二个函数返回的数据并呈现在UI界面上,result就是接收的数据。
首先我在doInBackground函数中用apacheHTTP获取数据,
HttpClient client=new DefaultHttpClient();
HttpGet get=new HttpGet(url);
String result = "";
HttpResponse response=client.execute(get);
HttpEntity entity=response.getEntity();
result = EntityUtils.toString(entity);
1,实例化一个Client
2,实例化一个Get,并URL放进去
3,把client的get,启动,这里有点像把action放进intent然后startActivity(intent); = =(个人理解,勿喷)
get 了以后获得一个”回应“(好抽象 = =).
4,然后在回应中getEntity 这里的entity有Bundle,大概是数据的集合,当然这里面是JSON形式的数据
5,用EntityUtils把数据集合转化为字符串,得到JSON格式的字符串用于后面解析,EntityUtils很方便的说,同样转化为字符串,对面的大神用IO流折腾了好几行。
获得了数据后,在doInBackground的最后把它 return出去,然后onPostExecute自然会接收到。然后在onPostExecute中获得JSON格式的字符串数据后,开始用JSONObejct和JSONTokener去解析。
JSONTokener tokener= new JSONTokener(result);
JSONObject object = (JSONObject) tokener.nextValue();
JSONObject weather= (JSONObject) object.get("weatherinfo");
//获取日期
date = weather.getString("date_y")+" "+weather.getString("week");
textview2.setText(date);
1,实例化一个JSONTokener,传入JSON格式的字符串
2,用nextValue方法获取JSONObject,注意这里的nextValue不只获取JSONObject,可以获取键值,键值对应的内容,
(突然想起有点想JAVA容器里面的next方法),”
此时还未读取任何json文本,直接读取就是一个JSONObject对象,
3,因为这里是两层JSON嵌套,所以第三行又获取一个JSONObject
4,然后就同个键值对获取字符串内容并展现在UI组件上。
以上都是这次任务碰到以及学到的新知识咯,虽是主要内容,但难度不大,下面吐槽下一下自己 = =
首先第一个吐槽的就是没好好分析师兄给的数据啦,差点以为那只有今天的天气信息,还是对面的大神够细心,专门到链接所在的网站去看,发现上面原来有好多的信息,有未来6天的信息。
第二就吐槽一次自己在UI布局设计上面的烂和懒。 = =最明显的一个地方就是,别人用了好几个布局管理器并且层层嵌套,我只用了一个相对布局管理器
。回想一下,自己当天晚上首先突破获取数据的难关,然后就随便弄了一个布局,然后就在原来的基础上复制粘贴,修改,在布局上面没有细心,用户体验和别人的立马见分晓。教训的话.... 以后突破主要技术点后,就仔细考虑UI布局,多层使用布局管理器,背景图片之类的东西可以参照类似软件(下载下来后解压获取里面的资源图片
)
第三不算吐槽,就算是惊醒自己一下:遇到死胡同一定要马上转出去。今天看到《范例大全》里面的有”页面转换“的例子,就是一键用过 setContent来改变该ACTIVITY的布局文件。但必须注意的一点是“布局文件上的组件必须先加载后注册”,今天有一个按钮是在转换后的布局文件上得,于是我在ACTITY上设置它的监听器,出现空指针异常。因为,ACTITY加载布局的时候并没用加载那个按钮,结果你直接设置监听器,这必须得出错啊 = =,后来仔细看了一下范例,它是在转换布局的按钮上注册并设置那个按钮的监听器,心想:要是我转换后的布局上有好多组件,那我那个转换的按钮岂不是要全部注册一遍,那得多麻烦啊,以后少用这招吧。
第四:好的用户体验是要发心思的,想对面的大神,根据信息更换天气图标,仔细布局,用Toast代替ProgressBar和ProgressDialog,等等。。
综上总结,以后突破技术难点后,就立马布局去,把UI布好了,再去写后面的代码,不然后面的代码跟UI连上后在去更改UI就很麻烦了,感觉不会爱的了
以上博文都收集在"资料文章中"