先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定

Lance_小超發表於2019-03-04

前言

使用這個標題先表示對老王的尊敬
api全部開放 但是伺服器使用的是美國伺服器 訪問速度特別慢 只用於學習
快速開發框架是我整理出來的一套框架 使用簡單 實現快速 GitHub地址,喜歡的童鞋歡迎star
MVP是一種開發模式 按照你自己理解和程式設計習慣的去實現就好 沒有必要一股腦的照搬
可能理論什麼的我也不蠻會說,接下來了部分,我帶你真正的打一場戰役
看到這裡如果你感興趣我建議你先下載app跑一遍,知道我們需要做的是什麼
專案的原始碼地址Freebook

這裡有那麼一群志同道合的人在等你加入 QQ群:173999252

先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定


效果圖

先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定


目錄

  • 底層框架搭建
  • 網路請求框架搭建
  • MVP模式實現
  • 使用的第三方框架介紹

底層框架搭建

萬事開頭難,實質上只要你走出第一步了,後面的路就能迎刃而解

在這裡我要先介紹一下我的底層框架LCRapidDevelop,這個框架能幹嘛呢?

  • 異常奔潰統一友好管理 無需擔心程式出現異常而遺失使用者
  • 頁面狀態 載入中 載入失敗 無資料快速實現
  • 下拉重新整理以及自動載入
  • RecyclerView的相關封裝快速實現item動畫adapter的編寫
  • Tab+Fragment快速實現效果Duang Duang Duang 可按照需求隨意修改成自己想要的
  • 視訊播放快速實現 這個功能是今天我們需要編寫的app唯一一個用不到的東西 我會考慮去除這個東西

功能呢列舉到這裡就差不多了,接下來我們需要把LCRapidDevelop新增到我們的專案裡並編譯專案

先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
專案結構

匯入後編譯一下如果沒有報錯我們進行下一步,新建好相應的資料夾

先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定

  • 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檔案

先定一個小目標!比如說先用MVP和快速開發框架打造一個免費下載小說的app老司機來手把手教你半天搞定
網路請求框架結構

  • 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();
}

相關文章