1. 程式人生 > >《APP研發錄》讀書筆記(1、重構)

《APP研發錄》讀書筆記(1、重構)

1、重新規劃Android專案結構
將主專案中的類分門別類的進行劃分,放置在各種包中
詳細介紹如下:
activity:所有的activity放在同一個包中,細分的話,將不同模組的activity劃分到不同的包下。
adapter:將所有的介面卡放在一塊。
entry:將所有的實體放在一塊。
db:資料庫。
engine:業務相關的類放在一塊。
ui:自定義控制元件。
utils:工具類。
interfaces:所有的介面,命名一I作為開頭
listener:基於listener的介面,命名以On開頭。
(1)、每個檔案只有一個單獨的類,不能巢狀類,比如在activity巢狀adapter、entry
(2)、可以迅速定位,分工明確

2、為activity定義新的生命週期

單一職責:一個類或一個方法,只負責一件事

在activity中新增下列方法,分工明確,易讀

initVariables():初始化變數,包括Intent和activity內的變數。
initViews(); 初始化控制元件,新增點選事件,介面卡,等。
initData();獲取資料

3、統一事件模型
3中點選事件方法
1、
`public class MainActivity extends Activity {
private Button btnshow;

@Override    
protected void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.activity_main);    
    btnshow = (Button) findViewById(R.id.btnshow);    
    btnshow.setOnClickListener(new OnClickListener() {    
        //重寫點選事件的處理方法onClick()    
        @Override    
        public void onClick(View v) {    
            //顯示Toast資訊    
            Toast.makeText(getApplicationContext(), "你點選了按鈕", Toast.LENGTH_SHORT).show();    
        }    
    });    
}        

} `

2、

//讓Activity方法實現OnClickListener介面    
public class MainActivity extends Activity implements OnClickListener{    
    private Button btnshow;    
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);    

        btnshow = (Button) findViewById(R.id.btnshow);    
        //直接寫個this    
btnshow.setOnClickListener(this); } //重寫介面中的抽象方法 @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "點選了按鈕", Toast.LENGTH_SHORT).show(); } }

3、

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"    
    android:id="@+id/LinearLayout1"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:orientation="vertical" >    
    <Button     
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:text="按鈕"    
        android:onClick="myclick"/>    
 </LinearLayout> 
public class MainActivity extends Activity {    
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);     
    }    
    //自定義一個方法,傳入一個view元件作為引數    
    public void myclick(View source)    
    {    
        Toast.makeText(getApplicationContext(), "按鈕被點選了", Toast.LENGTH_SHORT).show();    
    }    
} 

作者比較推崇第一種
只要在一個團隊內部達成了協議,決定使用某種事件程式設計方式,所有開發人員就要按照同樣的方式編碼。只要不是各有各的編碼風格就好。

4、實體化程式設計

4.1在網路請求中使用實體

用fastjson,gosn代替JSonobject和JsonArray解析json資料

4.2使用實體生成器

4.3在頁面跳轉中使用實體

對資料必須進行序列化

5、adapter模板

<RelativeLayout 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:padding="10dp">

 <TextView
 android:id="@+id/titleTv"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:singleLine="true"
 android:text="Android新技能"
 android:textColor="#444"
 android:textSize="16sp" />

 <TextView
 android:id="@+id/descTv"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/titleTv"
 android:layout_marginTop="10dp"
 android:maxLines="2"
 android:minLines="1"
 android:text="Android為ListView和GridView打造萬能介面卡"
 android:textColor="#898989"
 android:textSize="16sp" />

 <TextView
 android:id="@+id/timeTv"
 android:paddingTop="3dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@+id/descTv"
 android:layout_marginTop="10dp"
 android:text="2015-05-04"
 android:textColor="#898989"
 android:textSize="12sp" />

 <TextView
 android:padding="2dp"
 android:id="@+id/phoneTv"
 android:gravity="center"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@+id/descTv"
 android:layout_marginTop="10dp"
 android:background="#2ED667"
 android:drawableLeft="@mipmap/phone"
 android:drawablePadding="5dp"
 android:text="10086"
 android:textColor="#ffffff"
 android:textSize="12sp"
 android:layout_alignParentRight="true" />


</RelativeLayout> 
public class Bean {
 private String title;
 private String desc;
 private String time;
 private String phone;

 public Bean() {
 }

 public Bean(String title, String desc, String time, String phone) {
 this.title = title;

 this.desc = desc;
 this.time = time;
 this.phone = phone;
 }

 public String getTitle() {
 return title;
 }

 public void setTitle(String title) {
 this.title = title;
 }

 public String getDesc() {
 return desc;
 }

 public void setDesc(String desc) {
 this.desc = desc;
 }

 public String getTime() {
 return time;
 }

 public void setTime(String time) {
 this.time = time;
 }

 public String getPhone() {
 return phone;
 }

 public void setPhone(String phone) {
 this.phone = phone;
 }
}
public class MyAdapter extends BaseAdapter {
 private LayoutInflater mInflater;
 private List<Bean> mDatas;

 //MyAdapter需要一個Context,通過Context獲得Layout.inflater,然後通過inflater載入item的佈局
 public MyAdapter(Context context, List<Bean> datas) {

 mInflater = LayoutInflater.from(context);
 mDatas = datas;
 }

 //返回資料集的長度
 @Override
 public int getCount() {
 return mDatas.size();
 }

 @Override
 public Object getItem(int position) {
 return mDatas.get(position);
 }

 @Override
 public long getItemId(int position) {
 return position;
 }

 //這個方法才是重點,我們要為它編寫一個ViewHolder
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 ViewHolder holder = null;
 if (convertView == null) {
  convertView = mInflater.inflate(R.layout.item_listview, parent, false); //載入佈局
  holder = new ViewHolder();

  holder.titleTv = (TextView) convertView.findViewById(R.id.titleTv);
  holder.descTv = (TextView) convertView.findViewById(R.id.descTv);
  holder.timeTv = (TextView) convertView.findViewById(R.id.timeTv);
  holder.phoneTv = (TextView) convertView.findViewById(R.id.phoneTv);

  convertView.setTag(holder);
 } else { //else裡面說明,convertView已經被複用了,說明convertView中已經設定過tag了,即holder
  holder = (ViewHolder) convertView.getTag();
 }

 Bean bean = mDatas.get(position);
 holder.titleTv.setText(bean.getTitle());
 holder.descTv.setText(bean.getDesc());
 holder.timeTv.setText(bean.getTime());
 holder.phoneTv.setText(bean.getPhone());

 return convertView;
 }

 //這個ViewHolder只能服務於當前這個特定的adapter,因為ViewHolder裡會指定item的控制元件,不同的ListView,item可能不同,所以ViewHolder寫成一個私有的類
 private class ViewHolder {
 TextView titleTv;
 TextView descTv;
 TextView timeTv;
 TextView phoneTv;
 }

使用

public class MainActivity extends Activity {

 private ListView listView;
 private List<Bean> mDatas;
 private MyAdapter mAdapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 initView();
 initData();

 }

 //方法:初始化View
 private void initView() {
 listView = (ListView) findViewById(R.id.listView);
 }

 //方法;初始化Data
 private void initData() {
 mDatas = new ArrayList<Bean>();

 //將資料裝到集合中去
 Bean bean = new Bean("Android新技能1", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
 mDatas.add(bean);

 bean = new Bean("Android新技能2", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
 mDatas.add(bean);

 bean = new Bean("Android新技能3", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
 mDatas.add(bean);

 bean = new Bean("Android新技能4", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
 mDatas.add(bean);

 //為資料繫結介面卡
 mAdapter = new MyAdapter(this,mDatas);

 listView.setAdapter(mAdapter);
 }

}

6、型別安全裝換函式

型別轉換時,要判斷需要轉換的資料是否為空,提高程式健壯性

不要一門心思的看程式碼,生活能教會我們很多,然後反過來讓我們對程式設計有更深刻的認識。