Android应用软件开发

194课时
2.6K学过
8分

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
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();
}
} 

运行结果如下:

10