3分钟
7.6 实施步骤
实施步骤
1、在主界面添加一个EditText用于输入地名,一个Button按钮用于查询,两个TextView分别用于显示获取到的原始数据和解析后的数据。
表7-6-1 activity_main.xml主界面
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_city"
android:text="重庆"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_serch"
android:text="查询"
app:layout_constraintTop_toBottomOf="@+id/et_city"
android:onClick="getId"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview1"
app:layout_constraintTop_toBottomOf="@+id/btn_serch"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/textview1"
android:id="@+id/textview2"/>
</android.support.constraint.ConstraintLayout> 2、使用htmlServices文件用于读取网络数据。
表7-6-2 HtmlServices.java
public class HtmlServices {
public static String getHtml(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//输入流获取html数据
byte[] data = readInputStream(inStream);//得到html的二进制数据
String html = new String(data, "UTF-8");
return html;
}
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}3、数据操作JavaBean
表7-6-3WeatherInfo.java
public class WeatherInfo {
private String cityName;//地名
private String temp;//温度
private String WD;//风向
private String WS;//风力
private String SD;//湿度
private String time;//更新时间
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getWD() {
return WD;
}
public void setWD(String WD) {
this.WD = WD;
}
public String getWS() {
return WS;
}
public void setWS(String WS) {
this.WS = WS;
}
public String getSD() {
return SD;
}
public void setSD(String SD) {
this.SD = SD;
}
}4、主程序用于查询数据库得到城市编码,并根据编码查询相应网络天气数据,解析返回天气JSON数据并解析。
表7-6-4 MainActivity.java
public class MainActivity extends AppCompatActivity {
private EditText et_city;
private Button btn_serch;
private String html;
public SQLiteDatabase db;
private TextView textView1;
private TextView textView2;
DBHelper myhelper;
public int cityId;
public static String DB_PATH = "/data/data/com.example.myapplication/" + "databases/";
public static String SRC_DB_FILE_NAME = "cityId.db";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = (TextView) findViewById(R.id.textview1);
textView2=(TextView)findViewById(R.id.textview2);
et_city = (EditText) findViewById(R.id.et_city);
btn_serch = (Button) findViewById(R.id.btn_serch);
readDb();
}
public void getId(View view){
myhelper = new DBHelper(this);
Cursor c=myhelper.query();
c.moveToFirst();
cityId=c.getInt(c.getColumnIndex("CityId"));
Toast.makeText(this, ""+cityId, Toast.LENGTH_SHORT).show();
thread();
}
private SQLiteDatabase readDb(){
File dir = new File(DB_PATH);
if (!dir.exists()) {
dir.mkdir();
}
String srcDbName = DB_PATH + SRC_DB_FILE_NAME;
try {
InputStream inputStream = getResources().getAssets().open("cityId.db");
FileOutputStream fos = new FileOutputStream(srcDbName);
byte[] buf = new byte[1024 * 8];
int len = 0;
while ((len = inputStream.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
inputStream.close();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(srcDbName, null);
return database;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "cityId.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public Cursor query()
{
String cityname=et_city.getText().toString();
SQLiteDatabase db=getWritableDatabase();
Cursor c=db.query("city", null, "County=?", new String[]{cityname}, null, null, null);
return c;
}
}
public void thread(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
html = HtmlServices.getHtml("http://www.weather.com.cn/data/sk/"+cityId+".html");
} catch (Exception e) {
e.printStackTrace();
}
textView1.post(new Runnable() {
@Override
public void run() {
textView1.setText("获取的JSON数据:\n"+html);
WeatherInfo weather = new WeatherInfo();
try {JSONTokener jsonParser = new JSONTokener(html);
JSONObject object = (JSONObject) jsonParser.nextValue();
JSONObject details = object.getJSONObject("weatherinfo");
String city = details.getString("city");
String temp=details.getString("temp");
String WD=details.getString("WD");
String WS=details.getString("WS");
String time=details.getString("time");
textView2.setText("\n解析后的数据:\n" +
"城市:"+city+"\n温度:"+temp+"\n风向:"+WD+ "\n风力:"+WS+"\n"+"更新时间:"+time);
} catch (JSONException e) {
System.out.println("test");
e.printStackTrace();
}
}
});
}
});
thread.start();
}
} 运行结果如下:
学员评价