天氣開發1——第二行代碼(酷歐天氣)

前言:
首先我要感謝郭霖大神。郭霖大神的《第一行代碼》、《第二行代碼》可謂我的啓蒙書。這幾天特地把酷歐天氣實現一遍,感受頗深。
以下爲酷歐天氣開發筆記,其涉及到的開源框架有:

  1. litepal(數據庫操作)
  2. okhttp (網絡傳輸)
  3. butterknife(簡化findViewById,簡化代碼)
  4. glide(圖片加載)
  5. gson(解析Json)

一共有四篇,代碼下載鏈接在第四篇中:
天氣開發1——第二行代碼(酷歐天氣)
天氣開發2——第二行代碼(酷歐天氣)
天氣開發3——第二行代碼(酷歐天氣)
天氣開發4——第二行代碼(酷歐天氣)

效果圖:
這裏寫圖片描述

這裏寫圖片描述

添加依賴庫

    compile 'org.litepal.android:core:1.3.2'
    compile 'com.squareup.okhttp3:okhttp:3.6.0'
    compile 'com.google.code.gson:gson:2.7'
    compile'com.github.bumptech.glide:glide:3.7.0'

butterknife會有所不同:

在 app build.gradle中下載

dependencies {
  compile 'com.jakewharton:butterknife:8.6.0'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
}

在root build.gradle 根目錄中添加

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.6.0'
  }
}

最後回到app build.gradle中

apply plugin: 'com.jakewharton.butterknife'

litepal使用

在Manifest中聲明:

<application
        android:name="org.litepal.LitePalApplication"
        ..../>

創建一個assests的包,在創建litepal.xml 聲明數據庫的一些信息。
這裏寫圖片描述

這裏寫圖片描述


  • dbname表示數據庫的名字
  • version表示的是數據庫的版本,在後期創建數據庫表時需要更改版本號
  • list表示數據庫中所有的表
  • mapping表示的是數據庫表
<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value = "CoolWeather.db"></dbname> 
    <version value = "1"></version>
    <list>
        <mapping class="example.com.coolweather.db.Province" />
        <mapping class="example.com.coolweather.db.City" />
        <mapping class="example.com.coolweather.db.County" />
    </list>
</litepal>

我們只需要創建一個類,litepal就會自動給我們創建相應的數據庫表,也就是ORM,所以一個類就代表一張表。
注意: 要實現增刪改查操作,需要將類繼承DataSupport。


在天氣開發中我們需要接收省、市、縣的信息,所以在db包中我們創建了三張表:
Province,City,County用來存儲相關信息。

province:{"id":1,"name":"北京"}
city:{"id":113,"name":"南京"}
county:{"id":937,"name":"蘇州","weather_id":"CN101190401"}

根據Json數據,我們來設計對應類的內容。
下面是代碼,City和County給出主要代碼,getter和setter由Alt+Insert
自動生成,就不貼出來了。
Province:


public class Province extends DataSupport {
    private  int id;
    private String provinceName;
    private int provinceCode;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }

    public int getProvinceCode() {
        return provinceCode;
    }

    public void setProvinceCode(int provinceCode) {
        this.provinceCode = provinceCode;
    }
}

City:

public class City extends DataSupport {
    private  int id;
    private  int cityCode;
    private String cityName;
    private int provinceId;//省的Id
    ....
    }

County

public class County extends DataSupport{
    private int id;
    private String countyName;
    private String weatherId;
    private int cityId;
    }

okhttp使用

OkHttpClient client = new OkHttpClient();
//請求
Request request = new Request.Builder().url(address).build();
Response response = client.newCall(request).execute();
String data = response.body().string();//獲取的內容
//post
RequestBody requestBody = new FormBody.Builder()
             .add("username","admin")
             .add("password","123456")
             .build();
Request request = new Request.Builder()
            .url("http://www.baidu.com)
            .post(requestBody)
            .build();

butterknife使用

butterknife是一個專注於Android系統的View注入框架,可以減少大量的findViewById以及setOnClickListener代碼,可視化一鍵生成,這裏簡要的介紹通過它實例化view的方式:

@BindView( R.id.button1 )
public Button button1 ;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); 
//綁定activity 
ButterKnife.bind( this ) ;
}

官方文檔:https://github.com/JakeWharton/butterknife

glide使用

只需要一行代碼即可,glide會根據ImageView自動計算圖片大小來進行加載。

Glide.with(this).load(url).into(imageView);

gson使用

假設Json數據爲:

{"name":"Tom","age":20}

爲此我們定義一個Person類:

//與Json對應
class Person{
private String name;
private int age;
.....
}

將Json數據解析成Person對象:

String jsonData = response.body().string();//jsonData爲okhttp獲取到的Json數據
Gson  gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);

如果是Json數組時,就要用到TypeToken

{{"name":"Tom","age":20},{"name":"Jack","age":19},{"name":"Helen","age":21}}
Gson gson = new Gson();
List<Person> list = gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType());
for(Person person: list){
    Log.d("tag","id is "+person.getId());
    Log.d("tag","name is "+person.getName());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章