<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 {
//声明apikey
private 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
btn.setOnClickListener(new OnClickListener() {
@Override
public 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 block
e.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(){
@Override
public 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;
//这个类用来提交请求并接收服务器给我们返回的天气数据
//因为需要访问网络,会耗时所以需要创建新的线程,所以继承Thread
public class HttpRequestTools extends Thread{
//需要的相关参数:
String httpUrl,httpArg,apikey;
public TextView show;//显示数据
ImageView imageView;//显示天气图片
//通信的Handle
Handler 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;
}
@Override
public void run() {
super.run();
//缓存得到的数据
StringBuffer buffer = new StringBuffer();
BufferedReader reader=null;
String result=null;
//创建api的url组合
httpUrl=httpUrl+"?"+httpArg;
try {
/*-----------------------------------重点------------------------------------------------*/
//创建请求的url
URL 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() {
@Override
public 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 block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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.截图:
如果想要跟丰富的界面效果,就要小伙伴们自己设计实现了。