通过查找资料及自己开发完成
来源:互联网 发布:寻秦记 赵倩 知乎 编辑:程序博客网 时间:2024/06/06 12:41
<span style="color:#33ff33;">前期分析:需要三个类完成:一个主类、一个请求类、一个数据处理类<span style="white-space:pre"></span>MainActivity、HttpRequestTools、AnalyseTools</span>
<span style="color:#33ff33;"><span style="white-space:pre"></span>小伙伴们需要自己获取百度的天气API的请求接口及apikey;</span>
<span style="color:#33ff33;"><span style="white-space:pre"></span>应用到的Android知识:(简单到复杂):界面的布局--JSON数据的解析--数据的传递--网络通信--线程的使用</span>
1.主类
<pre name="code" class="java">package com.example.baidutq;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.app.Activity;public class MainActivity extends Activity {//声明apikeyprivate static final String apiKey="小伙伴自己获取";//上传请求的地址信息private String httpUrl = "http://apis.baidu.com/apistore/weatherservice/cityname";//用户输入的城市信息 private String httpArg = null; private Handler handler=null; private EditText cityET; private TextView showInfo; private ImageView imageView; private String cityName=null; private Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intiView(); btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {//注意在api文档中他没有提及直接用汉字传输信息是不行的,这里需要将用户输入的城市信息进行网络编码 //例如北京编码完成后就变成了%E5%8C%97%E4%BA%AC cityName = URLEncoder.encode(cityET.getText().toString(),"UTF-8");//转码} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}httpArg = "cityname="+cityName;/*--------------------------------------重点--------------------------------------------*///发送获取天气请求HttpRequestTools httpRequestTools = new HttpRequestTools(httpUrl, httpArg, apiKey, showInfo, imageView, handler);httpRequestTools.start();/*--------------------------------------重点--------------------------------------------*/}});}private void intiView() { cityET=(EditText) findViewById(R.id.ctyi_name); btn=(Button) findViewById(R.id.btn_chak); imageView=(ImageView) findViewById(R.id.show_Image); showInfo=(TextView) findViewById(R.id.text_show); handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);} }; }}
2.请求类
<pre name="code" class="java">package com.example.baidutq;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import org.apache.http.HttpClientConnection;import android.os.Handler;import android.widget.ImageView;import android.widget.TextView;//这个类用来提交请求并接收服务器给我们返回的天气数据//因为需要访问网络,会耗时所以需要创建新的线程,所以继承Threadpublic class HttpRequestTools extends Thread{//需要的相关参数:String httpUrl,httpArg,apikey;public TextView show;//显示数据ImageView imageView;//显示天气图片//通信的HandleHandler handler;//创建构造函数public HttpRequestTools(String httpUrl, String httpArg, String apikey,TextView show, ImageView imageView, Handler handler) {super();this.httpUrl = httpUrl;this.httpArg = httpArg;this.apikey = apikey;this.show = show;this.imageView = imageView;this.handler = handler;}@Overridepublic void run() {super.run();//缓存得到的数据StringBuffer buffer = new StringBuffer();BufferedReader reader=null;String result=null;//创建api的url组合httpUrl=httpUrl+"?"+httpArg;try {/*-----------------------------------重点------------------------------------------------*///创建请求的urlURL url = new URL(httpUrl);//发送获取天气的请求 HttpURLConnection connection = (HttpURLConnection) url.openConnection();//打开请求--链接请求 connection.setRequestMethod("GET");//请求方式 connection.setRequestProperty("apikey", apikey);//请求key connection.connect();//提交请求 //接受传回的数据---保存到数据流中 InputStream in = connection.getInputStream(); reader= new BufferedReader(new InputStreamReader(in, "UTF-8")); String str; while ((str=reader.readLine())!=null) {buffer.append(str+"\n");} //数据接受完,关闭流操作 reader.close(); in.close(); result=buffer.toString(); //对得到数据进行Json解析 AnalyseTools analyseTools = new AnalyseTools(result); //解析后的数据AnalyseText final String finalResult = analyseTools.AnalyseText(); //更新数据 handler.post(new Runnable() {@Overridepublic void run() {show.setText(finalResult);//显示返回的数据if (finalResult.contains("多云")) {imageView.setImageResource(R.drawable.duoyun);}else if (finalResult.contains("晴")) {imageView.setImageResource(R.drawable.qing);}else if (finalResult.contains("雨")) {imageView.setImageResource(R.drawable.yu);}else if (finalResult.contains("阴")) {imageView.setImageResource(R.drawable.yin);}else if (finalResult.contains("雪")) {imageView.setImageResource(R.drawable.xue);}}});} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
3.数据处理类
package com.example.baidutq;import org.json.JSONException;import org.json.JSONObject;//对数据进行处理public class AnalyseTools { String receiveInfo=null; //构造方法传入解析的JSON数据 AnalyseTools(String JsonText) { receiveInfo=JsonText; } //解析接受的文本信息 public String AnalyseText(){ String weatherInfo=null; //天气的信息 //先判断一下天气是否获取成功,如果没成功会有errNum:-1提示 if(receiveInfo.contains("\"errNum\":-1")) //失败的标志 { weatherInfo="请求天气数据失败,请稍后再试"; } else { try { //使用Json来解析文本数据 JSONObject jsonObject = new JSONObject(receiveInfo); //定位到retData关键词 JSONObject json = (JSONObject) jsonObject.get("retData"); StringBuffer sb = new StringBuffer(); sb.append("城市: " + json.getString("city") + "\n"); sb.append("日期: " + json.getString("date") + "\n"); sb.append("发布时间: " + json.getString("time") + "\n"); sb.append("天气情况: " + json.getString("weather") + "\n"); sb.append("温度: " + json.getString("temp") + "\n"); sb.append("最低气温: " + json.getString("l_tmp") + "\n"); sb.append("最高气温: " + json.getString("h_tmp") + "\n"); sb.append("风向: " + json.getString("WD") + "\n"); sb.append("风力: " + json.getString("WS") + "\n"); sb.append("日出时间: " + json.getString("sunrise") + "\n"); sb.append("日落时间: " + json.getString("sunset") + "\n"); weatherInfo = sb.toString(); } catch (JSONException e) { e.printStackTrace(); } } return weatherInfo; } }
4.相关的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <ImageView android:id="@+id/show_Image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/mm"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/ctyi_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="例如:"上海" /> <Button android:id="@+id/btn_chak" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_chak" /> </LinearLayout> <TextView android:id="@+id/text_show" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
5.截图:
如果想要跟丰富的界面效果,就要小伙伴们自己设计实现了。
0 0
- 通过查找资料及自己开发完成
- 总结一个技巧 通过图片查找资料
- play framework如何进行模块化开发--学习笔记(借鉴同事、博客等资料自己试验通过!)
- 自己资料
- seajs学习问题集及相关查找解决资料
- 自己的PHP开发框架第2版基本完成
- ffmpeg源码及相关开发资料下载
- 飞信Fetion 开发资料及下载
- 飞信Fetion 开发资料及下载
- ios软件开发及学习资料下载
- 入门微信小程序开发及相关资料
- OC类的理解(资料收集及自己认知)
- 【Android开发资料分享】自己整理的Android开发资料,非常全面
- 自己收集的一些音视频的开发资料
- 曾经易错的地方,通过网络上查找资料,做的总结,方便以后查看
- 【SQL】通过rowid查找及删除重复记录
- Session超时自己完成
- 通过Camera、SurfaceView、自己实现拍照及预览效果
- 第四周任务—输出圆柱体表面积
- 深度学习在目标跟踪中的应用
- 属性动画、帧动画、补间动画的介绍使用及对比
- 机器学习脑图:回归案例分析
- Jquery获取select,dropdownlist,checkbox 下拉列表框的值
- 通过查找资料及自己开发完成
- unity之UGUI屏幕分辨率調整
- 第四周项目三
- idea +maven +jetty 插件配置
- Android Studio的一些技巧
- 96. Unique Binary Search Trees
- 三、oracle 用户管理一
- 第四周项目2-建设“单链表”算法库 .
- 解密RecyclerView自定义分割线