前言
使用這個標題先表示對老王的尊敬
api全部開放 但是伺服器使用的是美國伺服器 訪問速度特別慢 只用於學習
快速開發框架是我整理出來的一套框架 使用簡單 實現快速 GitHub地址,喜歡的童鞋歡迎star
MVP是一種開發模式 按照你自己理解和程式設計習慣的去實現就好 沒有必要一股腦的照搬
可能理論什麼的我也不蠻會說,接下來了部分,我帶你真正的打一場戰役
看到這裡如果你感興趣我建議你先下載app跑一遍,知道我們需要做的是什麼
專案的原始碼地址Freebook
這裡有那麼一群志同道合的人在等你加入 QQ群:173999252
效果圖
目錄
- 底層框架搭建
- 網路請求框架搭建
- MVP模式實現
- 使用的第三方框架介紹
底層框架搭建
萬事開頭難,實質上只要你走出第一步了,後面的路就能迎刃而解
在這裡我要先介紹一下我的底層框架LCRapidDevelop,這個框架能幹嘛呢?
- 異常奔潰統一友好管理 無需擔心程式出現異常而遺失使用者
- 頁面狀態 載入中 載入失敗 無資料快速實現
- 下拉重新整理以及自動載入
- RecyclerView的相關封裝快速實現item動畫adapter的編寫
- Tab+Fragment快速實現效果Duang Duang Duang 可按照需求隨意修改成自己想要的
- 視訊播放快速實現 這個功能是今天我們需要編寫的app唯一一個用不到的東西 我會考慮去除這個東西
功能呢列舉到這裡就差不多了,接下來我們需要把LCRapidDevelop新增到我們的專案裡並編譯專案
匯入後編譯一下如果沒有報錯我們進行下一步,新建好相應的資料夾
- Constant — 用於存放常量資料
- Data — 編寫資料請求相關程式碼
- Dialog —編寫自定義對話方塊
- MVP — 所有頁面都些這裡 等等我會針對這個進行解釋
- MyApplication —存放自定義Application
- Util —存放工具類
- Widget –存在自定義view
然後就是Application的編寫了
/*
*自定義Application
* 用於初始化各種資料以及服務
* */
public class MyApplication extends Application {
//記錄當前棧裡所有activity
private List activities = new ArrayList();
@Override
public void onCreate() {
super.onCreate();
instance = this;
//異常友好管理初始化
Recovery.getInstance()
.debug(true)
.recoverInBackground(false)
.recoverStack(true)
.mainPage(WelcomeActivity.class)
// .skip(H5PayActivity.class) 如果應用整合支付寶支付 記得加上這句程式碼 沒時間解釋了 快上車 老司機發車了
.init(this);
}
/**
* 應用例項
**/
private static MyApplication instance;
/**
* 獲得例項
*
* @return
*/
public static MyApplication getInstance() {
return instance;
}
/**
* 新建了一個activity
*
* @param activity
*/
public void addActivity(Activity activity) {
activities.add(activity);
}
/**
* 結束指定的Activity
*
* @param activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
this.activities.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 應用退出,結束所有的activity
*/
public void exit() {
for (Activity activity : activities) {
if (activity != null) {
activity.finish();
}
}
System.exit(0);
}
}複製程式碼
並且在AndroidManifest.xml中使用這個android:name=”.MyApplication.MyApplication”
然後就是BaseActivity和BaseFragment的編寫了
在MVP資料夾內新建資料夾Base 然後新建BaseActivity.class
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener {
protected Context mContext;
private ConnectivityManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 鎖定豎屏
mContext = getActivityContext();
initView();
ButterKnife.bind(this);
initdata();
MyApplication.getInstance().addActivity(this);
}
/**
* 初始activity方法
*/
private void initView() {
loadViewLayout();
}
private void initdata(){
findViewById();
setListener();
processLogic();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
MyApplication.getInstance().finishActivity(this);
}
/**
* 載入頁面layout
*/
protected abstract void loadViewLayout();
/**
* 載入頁面元素
*/
protected abstract void findViewById();
/**
* 設定各種事件的監聽器
*/
protected abstract void setListener();
/**
* 業務邏輯處理,主要與後端互動
*/
protected abstract void processLogic();
/**
* Activity.this
*/
protected abstract Context getActivityContext();
/**
* 彈出Toast
*
* @param text
*/
public void showToast(String text) {
Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
public boolean checkNetworkState() {
boolean flag = false;
//得到網路連線資訊
manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//去進行判斷網路是否連線
if (manager.getActiveNetworkInfo() != null) {
flag = manager.getActiveNetworkInfo().isAvailable();
}
return flag;
}
}複製程式碼
然後就是BaseFragment.class
/**
* 這個是最簡單的 大家實際使用時 可新增我自想要的元素
*/
public abstract class BaseFragment extends Fragment{
private View mRootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRootView = initView(inflater,container);
ButterKnife.bind(this, mRootView);//繫結到butterknife
return mRootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initListener();
initData();
}
protected abstract View initView(LayoutInflater inflater,ViewGroup container);
protected abstract void initListener();
protected abstract void initData();
}複製程式碼
到這裡基本上底層框架搭建就搭建好了,如果熟練了的話,這個過程複製貼上不到兩分鐘就能搞定, 第一次搭建的話算個10分鐘吧
網路請求框架搭建
網路請求框架實質上就是上面我們提到的Data檔案
- api — 編寫網路請求的api以及快取api
- db –SQLite資料的相關處理 這裡主要用於儲存下載資訊
- HttpData —統一網路請求處理
- Retrofit —是相關的配置 包括請求時彈出載入中對話方塊什麼的
網路請求採用的是 RxJava +Retrofit2.0 + okhttp +RxCache ,是目前最為主流也是個人認為最好用最高效的網路請求 首先相應的包先導好
compile `io.reactivex:rxjava:1.1.8`
compile `io.reactivex:rxandroid:1.2.1`
compile `com.squareup.retrofit2:retrofit:2.0.0-beta4`
compile `com.squareup.retrofit2:converter-gson:2.0.0-beta4`
compile `com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4`
compile `com.github.VictorAlbertos.RxCache:core:1.4.6`複製程式碼
關於這個網路請求框架的搭建我就不細說了,掘金的文章太多了,懶得去了解的朋友呢直接複製我的程式碼,我教你怎麼使用好了,就跟我賜予你一把寶劍,知道使用就好乾嘛還要去了解寶劍是怎麼製造的,哈哈 當然這是一句玩笑話啦
首先是BookService.class的編寫 api文件地址
/**
* API介面
* 因為使用RxCache作為快取策略 所以這裡不需要寫快取資訊
*/
public interface BookService {
//獲取首頁詳情
@GET("api/getHomeInfo")
Observable<httpresult> getHomeInfo();
//獲取書籍詳情
@GET("api/getBookInfo")
Observable<httpresult> getBookInfo(@Query("id") int id);
//獲取類別列表
@GET("api/getTypeConfigList")
Observable<httpresult<list>> getTypeList();
//根據類別獲取書籍列表
@GET("api/getTypeBooks")
Observable<httpresult<list>> getBookList(@Query("type")int type,@Query("pageIndex")int pageIndex);
//根據關鍵詞獲取搜尋書籍列表
@GET("api/getSearchList")
Observable<httpresult<list>> getSearchList(@Query("key")String key);
//獲取熱門搜尋標籤
@GET("api/getSearchLable")
Observable<httpresult<list<String>>> getHotLable();
}