小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

獨(dú)立開發(fā) 一個(gè)社交 APP 的架構(gòu)分享 (已實(shí)現(xiàn))

 quasiceo 2016-07-19

前言:

    這算是我的第一個(gè) 完完全全 由自己開發(fā)的社交類安卓APP,截止2016-7-15,第二版本的優(yōu)化完善已順利完成,可以正常使用。下面我將一 一講述各個(gè)點(diǎn),日后如果不上線,那么將考慮全面開源,含移動(dòng)端代碼服務(wù)器接口代碼,留意我的 GitHub。

  由于內(nèi)容十分地多,我盡我自己的能力將各個(gè)功能模塊的做法盡可能地去講清楚,歡迎留言,有問必復(fù),文章會(huì)不斷更新,下面所有談及的功能皆已實(shí)現(xiàn)。

 

目錄:(點(diǎn)擊可跳轉(zhuǎn))

一 、功能架構(gòu)

二 、移動(dòng)端架構(gòu)概述

三、服務(wù)端架構(gòu)概述


一、功能架構(gòu)

公共部分
  • 所有用戶頭像顯示圓形,點(diǎn)擊即跳轉(zhuǎn)到詳情頁面
  • 詳情頁面可以看到該用戶的所有帖子操作記錄,頭像和背景圖片
  • 帖子、文章圖片點(diǎn)擊是看大圖的效果,支持雙指縮放,多圖側(cè)滑切換,無限循環(huán)
用戶管理
  • 注冊
    • 只能手機(jī)號(hào),有短信驗(yàn)證
    • 可選擇同時(shí)上傳頭像
    • 忘記密碼
  • 登錄
    • 公共部分
      • 登錄設(shè)置緩存,一次登錄后,不退出的話,那么以后的不用重復(fù)輸入
    • 登錄方式
      • 手機(jī)號(hào)碼登錄
      • 第三方登錄,含微信、新浪微博
帖子模塊
  • 發(fā)布
    • 文字輸入,包含敏感詞檢索,例如臟話
    • 圖片選擇,含相冊或拍照,可以移出
    • 視頻錄制,自定義時(shí)間長度、斷點(diǎn)錄制,支持預(yù)覽
    • 共享位置
  • 瀏覽:
    • 公共部分
      • 都會(huì)顯示出用戶頭像、發(fā)帖或評(píng)論的時(shí)間和評(píng)論的數(shù)目
    • 按編輯
      • 圖文混排類型
      • 圖文加視頻錄制類型
    • 按類型(內(nèi)容布局各不相同)
      • 圈子,可以發(fā)布視頻,顯示位置
      • 我的作品,圖文混排,瀑布流顯示
      • 創(chuàng)業(yè),不開啟評(píng)論與點(diǎn)贊
  • 操作:
    • 帖子評(píng)論與評(píng)論的回復(fù),包含表情的插入
    • 帖子與評(píng)論的點(diǎn)贊與撤銷點(diǎn)贊
    • 分享、收藏、舉報(bào)、信息分享到微信等平臺(tái)、刪除(帖主)等功能
文章模塊
  • 瀏覽:
    • 內(nèi)容頁純html,網(wǎng)頁瀏覽
  • 發(fā)布:
    • 由管理員通過網(wǎng)頁后臺(tái)編輯發(fā)布,形成html標(biāo)簽流
  • 兼容:
    • 使用x5瀏覽器內(nèi)核顯示,效果和微信相似,包括視頻播放
  • 權(quán)限
    • 除了不能被帖子點(diǎn)贊,其他同帖子操作
我的模塊(用戶信息)
  • 我的背景圖片
    • 顯示在個(gè)人信息頁面
    • 點(diǎn)擊可以修改,含剪輯
  • 我的消息模塊
    • 推送
    • 點(diǎn)贊提醒
    • 評(píng)論與回復(fù)提醒
    • 顯示效果為小紅點(diǎn)和消息數(shù)目的提示
  • 資料管理模塊
    • 頭像圖片修改,含剪輯
    • 昵稱修改
    • 密碼修改
    • 性別修改
    • 簽名、手機(jī)、郵箱、微信、興趣愛好等個(gè)人資料的顯示修改
  • 帖子管理
    • 公共部分,點(diǎn)擊某一條,都會(huì)跳轉(zhuǎn)進(jìn)入對應(yīng)帖子或文章
    • 我的帖子模塊,顯示所有發(fā)過的帖子
    • 我的評(píng)論,顯示所有發(fā)過的評(píng)論,包含回復(fù)
    • 我喜歡的模塊,顯示所有點(diǎn)過贊的帖子或評(píng)論
    • 我的收藏模塊,顯示所有收藏過的帖子或文章
  • 我的設(shè)置模塊
    • 操作記錄私有,開啟了,別的用戶無法查看你的操作記錄
    • 推送設(shè)置的開啟與否
    • 緩存清理
    • 檢測更新
    • 意見反饋
    • 分享給朋友
    • 關(guān)于我們以及評(píng)分
搜索模塊
  • 功能
    • 支持模糊搜索
    • 具備搜索的歷史緩存
  • 類型
    • 搜索各類帖子
    • 搜索歷史記錄
    • 搜索用戶
    • 搜索文章

       說實(shí)話,這個(gè)項(xiàng)目的文件夾已達(dá)1.5G,安裝包混淆編譯后27M,我在寫之前,就在想要怎么把它攤開來講,想想真的很復(fù)雜,腦子?xùn)|西東西太多。

 

二、移動(dòng)端架構(gòu)概述

1,框架層
  • 圖片部分
          在說使用的框架之前,先說說,APP安裝包的大小的影響,包的大小可以算進(jìn)去用戶體驗(yàn)的一部分,過多地使用框架只會(huì)加大APK體積和內(nèi)存消耗,例如 static final int/String 或 65535限制,在使用框架的時(shí)很多時(shí)候,都是只使用其中的一個(gè)功能。
          現(xiàn)在我只保留了一個(gè),不包括第三方SDK,例如OneKeyShare,保留的是 imageLoader,保留它的原因是,它的功能就是顯示圖片,而對于圖片這類數(shù)據(jù),可以說是占內(nèi)存最大的大頭,我能力有限,暫時(shí)還不能利用系統(tǒng)庫封裝好個(gè)比imageLoader更好的庫,同類的庫還有 picasso、fresco、volley等,曾經(jīng)也引入過 fresco,比imageLoader多了很多API,考慮到框架的成熟性最后沒使用,volley就不僅僅是顯示個(gè)圖片那么簡單了,還有網(wǎng)絡(luò)請求,上傳等,網(wǎng)絡(luò)請求和上傳的代碼這部分因?yàn)槲易约耗軌驅(qū)懗鲞€不錯(cuò)的幾個(gè)函數(shù),所以為了減少不必要的消耗,沒使用volley。
  • 網(wǎng)絡(luò)部分
           上面說到volley具備網(wǎng)絡(luò)的大部分需求,例如get、post請求操作,除了這個(gè),還有 android-async-http、okHttp 等,這些我都有了解過,也在別的項(xiàng)目里面使用過,但我沒使用到BananaCloud,原因就是上面談到的網(wǎng)絡(luò)請求和上傳的代碼這部分,如果自己封裝好,且封裝得不錯(cuò),就不需要再去使用框架。
  • 富文本編輯器
           這個(gè)在一個(gè)月前還有使用,基于gitHub 安卓開源項(xiàng)目-richEditor二次開發(fā)而來,原作者的項(xiàng)目,bug比較多,且兼容性非常差,在我修改完之后,最后一次發(fā)現(xiàn)bug是在紅米手機(jī)上面,編輯框完全失效,逐棄之。修改的教程請轉(zhuǎn)移到我的博文:點(diǎn)我
  • 視頻播放器

    • 原生

      • Ijkplayer(輕量級(jí))
        它是Blibli技術(shù)團(tuán)隊(duì)開源的一個(gè)視頻播放框架,原框架需要自己編譯.so,我當(dāng)時(shí)在他們的基礎(chǔ)上編譯和封裝好了一個(gè),詳情移至我 github 的 ijkplayerDemo
      • Vlc(重量級(jí))
        國外的一個(gè)視頻播放框架,體積比較大,一樣需要自己動(dòng)手編譯.so,相比ijk,它功能強(qiáng)大一點(diǎn),詳情移至我 github 的 VlcDemo
    • 網(wǎng)頁

      • 基于javaScript播放器
        這個(gè)是我最初的嘗試,在使用原生播放器的時(shí)候,通過正則替換文章內(nèi)容的video標(biāo)簽,提取 src,然后組合 js 的播放器里面,能夠自定義很多功能,例如:調(diào)節(jié)亮度和聲音。
      • 直接使用騰訊x5瀏覽器內(nèi)核
        其實(shí),我一直想做一個(gè)像微信打開公眾平臺(tái)文章那樣的網(wǎng)頁 webView,兼容性強(qiáng),速度快且對視頻的兼容十分好。這也是我最終的選擇
2,線程層

       由于我網(wǎng)絡(luò)請求這塊沒使用框架,所以線程的選用時(shí) Thread + Handler 組合或 AsyncTask ,需要明確一點(diǎn),AsyncTask 比 Thread + Handler 更耗資源,不過使用起來比較方便。

  • 數(shù)據(jù)列表類型的頁面數(shù)據(jù)加載采用自定義的 AsyncTask 繼承類來進(jìn)行網(wǎng)絡(luò)線程
  • 類似收藏、舉報(bào)這類低數(shù)據(jù)流的網(wǎng)絡(luò)請求采用 Thread + Handler 組合
  • 圖片并發(fā)上傳的類型,采用線程池進(jìn)行
3,緩存層

       Android 的數(shù)據(jù)存儲(chǔ)方式有5種,分別是 SharedPrefrences、File、SQLite、ContentProvider、NetWork。我采用的是 SharedPrefrences 和 File即是文件存儲(chǔ),其中

  • 標(biāo)記性數(shù)據(jù)采用 SharedPrefrences,例如是否隱藏操作記錄,用戶名稱等
  • 帖子列表、評(píng)論列表類大批量數(shù)據(jù)采用了File文件存儲(chǔ),原因是操作方便,只需要序列化和發(fā)序列化操作就能很方便地讀出緩存并顯示
4,網(wǎng)絡(luò)層
  • 加載
         全部是自己基于 HttpUrlConnection 封裝的工具類。

  • 邏輯

    • 廣播監(jiān)聽網(wǎng)絡(luò)狀態(tài)的變化以做對應(yīng)操作
    • 加載前進(jìn)行網(wǎng)絡(luò)連接是否可達(dá)判斷
    • 斷網(wǎng)情況啟用緩存
5,實(shí)現(xiàn)層

       帖子分享,我采用的 OneKeyShare SDK,之所以使用它,是因?yàn)樗呀^大部分的平臺(tái)的SDK分享接口都集成了,例如微信、QQ、QQ空間、新浪微博、知乎等等等等。

   1) 注冊與登錄
  • 注冊
    • 號(hào)碼
      • 對只能是數(shù)字的檢測
      • 手機(jī)號(hào)碼 11 位的限制
      • 是否之前注冊過的檢查,這塊要和服務(wù)器對接
    • 密碼
      • 位數(shù)的限制,例如最少 6 位
      • 加密傳輸
    • 短信驗(yàn)證
      • 使用阿里大魚服務(wù)商,服務(wù)端寫好接口,移動(dòng)端通過get或post手機(jī)號(hào)碼過去,然后接口調(diào)用API發(fā)送
      • 重復(fù)發(fā)送的倒計(jì)時(shí)
  • 手機(jī)登錄

  • 第三方登錄

    • 微信登錄
      使用的是微信開放平臺(tái)的 SDK,注意要先判斷用戶是否有安裝微信
    • 新浪微博登陸
      使用新浪開放平臺(tái)的 SDK,新浪SDK會(huì)自動(dòng)判斷用戶是否有安裝新浪APP
   2) 發(fā)表帖子功能的實(shí)現(xiàn)
  • 編輯

    • 文字部分

      • 字?jǐn)?shù)的限制
        一定要限制用戶帖子的輸入字?jǐn)?shù)的限制,一來減少服務(wù)器負(fù)擔(dān),二來避免惡意刷帖。
      • 內(nèi)容過濾
        要過濾掉某些敏感詞,防止色情或其他內(nèi)容出現(xiàn)

      • 用戶位置獲取
        使用百度地圖API

    • 圖片部分

      • 選擇
        • 張數(shù)的限制
        • 模仿了微信的圖片選擇器,采用GirdView加載,可以多張一起選擇
        • 拍照
      • 顯示
        • 命名采用:用戶賬號(hào)+帖子id+圖片下標(biāo),這樣的好處是,完全能夠唯一標(biāo)識(shí),且在看帖頁面加載方便,組合鏈接簡單。
        • 在發(fā)帖頁面顯示縮略圖,提供有點(diǎn)擊看大圖和移除的功能
      • 圖片服務(wù)器采用騰訊云- - -萬象優(yōu)圖
        1,具備縮放功能,方便生成、加載縮略圖
        2,可以自定義添加水印
        3,鑒黃圖,這是最重要的!
    • 視頻錄制

      • 封裝系統(tǒng)的 Camera + surface 錄制,返回路徑
      • 預(yù)覽的時(shí)候直接用mediaPlayer + surface 播放
  • 上傳

    • 注意大小,我是壓縮控制在450K左右
      • 好處:
        1, 加速上傳速度
        2, 加快用戶在加載圖片時(shí)的速度
        3, 減少流量消耗
    • 先上傳圖片,在圖片上傳成功后,再開始上傳文字內(nèi)容,如果出錯(cuò),圖片可以直接覆蓋,文字成功,圖片失敗時(shí),帖子避免數(shù)據(jù)混亂
    • 采用線程池上傳,一來方便控制并發(fā)數(shù),二來方便回收內(nèi)存
   3) 帖子列表的顯示
  • 控件選取

       選用了安卓5.0 的 SwipeRefreshLayout + RecyclerView,原因是 SwipeRefreshLayout 自身帶有下拉刷新,最早的時(shí)候使用的是 PullToRefresh 開源項(xiàng)目。RecyclerView 重寫onScroll() 就可以搞定加載更多,還有一個(gè)原因,RecyclerView 自帶有瀑布流布局屬性。
       早之前我使用的是 LinearLayout 實(shí)現(xiàn)的,不斷地 addView 再 remove,致命的缺點(diǎn)是內(nèi)存消耗不合理。

  • 加載限制
    • 數(shù)據(jù)加載采用分批加載的方式進(jìn)行,減輕服務(wù)器的并發(fā)請求負(fù)擔(dān)和達(dá)到移動(dòng)端的合理顯示效果。
    • 帖子主要內(nèi)容的加載應(yīng)該只加載摘要,否則內(nèi)容過多,會(huì)造成數(shù)據(jù)處理時(shí)間過長,顯示慢。
   4) 帖子詳情頁的顯示
  • 代碼結(jié)構(gòu)

    • 由于帖子的類型有三種,這三種帖子除了內(nèi)容部分布局不一樣,評(píng)論布局是一樣的,分享、刪除等按鈕也是一樣的,當(dāng)然,也可以自己通過接口改變評(píng)論布局。所以在類的集成方面,我采用了三個(gè)抽象類父類,子類只需要傳進(jìn)入自己布局、實(shí)現(xiàn)評(píng)論數(shù)據(jù)適配器 Adapter 即可。
      • 數(shù)據(jù)請求抽象類,含有請求方面的方法與屬性
      • 數(shù)據(jù)組合抽象類,含有獲取數(shù)據(jù)后進(jìn)行組合的方法與屬性
      • 數(shù)據(jù)顯示抽象類,處理大部分的公共操作,例如評(píng)論列表的顯示,分享等功能按鈕,同時(shí)留有自定義布局的接口
  • 邏輯

    • 數(shù)據(jù)請求,根據(jù)點(diǎn)擊跳轉(zhuǎn)過來的帖子 id 來進(jìn)行服務(wù)器數(shù)據(jù)請求。
    • 樓層評(píng)論
      • 判斷是否已登錄
      • 判斷內(nèi)容是否有表情
      • 判斷是否是回復(fù),回復(fù)就需要把被回復(fù)者的名稱改顏色,并且添加點(diǎn)擊事件
      • 采用 post 上傳,因?yàn)椴捎胓et會(huì)有字節(jié)限制和中文亂碼的問題,還一個(gè)是數(shù)據(jù)安全
      • 評(píng)論成功后再做應(yīng)的UI更新,防止失敗頁面顯示錯(cuò)亂
    • 點(diǎn)贊
      • 判斷是否已經(jīng)登錄
      • 判斷之前是否點(diǎn)過贊,否則就是撤銷贊,這個(gè)操作需要在加載點(diǎn)贊賬號(hào)的時(shí)候,保存到一個(gè)列表里面,例如 List 以作后續(xù)的判斷。
      • 點(diǎn)贊成功后再做對應(yīng)的UI更新,例如點(diǎn)贊圖標(biāo)變顏色等等
  • 布局

       采用的布局是 HeaderView + CommentView,HeaderView 用于顯示帖子的所有內(nèi)容含帖子點(diǎn)贊,CommentView 用來顯示用戶的評(píng)論

  • 加載順序
    1,請求服務(wù)器數(shù)據(jù),判斷該帖子是否有被刪除
    2,沒被刪除,那么先加載帖子的內(nèi)容
    3,最后再加載帖子的評(píng)論
   5) 消息提醒

       消息提醒采用了極光推送的SDK實(shí)現(xiàn)

  • 以用戶賬號(hào)注冊推送
  • 在服務(wù)端評(píng)論、點(diǎn)贊的接口代碼處觸發(fā)推送API
  • 通過廣播的形式獲取推送,顯示消息提醒
   6) 表情模塊
  • 匹配
    • 以圖片的名字組合其他標(biāo)記符組合為 key,例如 [ ],資源id為value,放至常量區(qū)
    • 以正則匹配 key 的方式來判斷是否有表情輸入
  • 顯示
    • 使用Spannable來將文字替換成drawable
    • 選擇頁面的顯示采用 GirdView + viewPager 顯示
   7) 其他部分

       收藏、刪除、舉報(bào),這些操作進(jìn)行一次get操作,傳遞帖子的id給服務(wù)器,服務(wù)器處理完畢后,就做對應(yīng)操作

  • 收藏,不能重復(fù)收藏,服務(wù)器做判斷,返回信息
  • 刪除,只能是帖主操作,刪除成功后,返回主頁刷新頁面數(shù)據(jù)

       其他功能能的實(shí)現(xiàn)基本同上述。

   8) 優(yōu)化
  • 安裝包
    • .so 動(dòng)態(tài)庫的添加,現(xiàn)在絕大部分手機(jī)已經(jīng)支持 armeabi cpu 架構(gòu),所以只需要編譯這種進(jìn)去就夠了,不是越多越好,越多,安裝包會(huì)跟著變大!
    • 減少不必要的庫引用
  • 內(nèi)存

 

   9) 使用的庫

 第三方

 自己派生

 

三、服務(wù)端架構(gòu)概述

 

       第二部分結(jié)束得有點(diǎn)匆忙,我真的很想把所有的東西都寫下來,如果加上我一路遇到過的 bug 及其解決方法,估計(jì)還要寫兩天。主要原因是,有很多我記得已經(jīng)不是太清楚了。

 
1,服務(wù)器
  • 集群 
    • 阿里云 Linux centos 6.5 操作系統(tǒng),以ngnix 解析
    • 騰訊云- - - 萬象優(yōu)圖,只用來存放圖片
  • MySQL 數(shù)據(jù)庫,MyISAM 與 InnoDB 引擎
  • php 語言開發(fā)接口
2,數(shù)據(jù)庫引擎

       最初的我并沒有采用 InnoDB,而是所有表都是全部是 MyISAM 。改用的原因是MyISAM 不支持事務(wù)InnoDB支持事務(wù),而且社交類APP的數(shù)據(jù)庫操作過多偏向于insert、updatedelete 這種操作如果涉及多表或單表互聯(lián)操作的情況,為了避免數(shù)據(jù)寫臟,所以使用事務(wù)。因?yàn)檎麄€(gè)過程中若一條錯(cuò)誤,便可以回滾到開始時(shí)的狀態(tài)。

  • MyISAM 的查詢速度比InnoDB快
  • 查詢高發(fā)的表采用 MyISAM 引擎
  • 數(shù)據(jù)比較重要或多寫操作的表采用InnoDB引擎
3,數(shù)據(jù)庫設(shè)計(jì)

       對于數(shù)據(jù)庫設(shè)計(jì),不應(yīng)該過多依賴范式,適度的冗余可以加快搜索速度,在服務(wù)器的配置還可以的情況下,可以采用冗余來解決查找慢的問題。

       常被 update 的字段,不應(yīng)該出現(xiàn)在多張表,應(yīng)該使用一張表,例如用戶的名稱,userName 這個(gè)肯定是會(huì)被經(jīng)常改變的。否則在update數(shù)據(jù)的時(shí)候你要多張表更新!

  • 帖子有三種類型,對應(yīng)三張表,文章獨(dú)立一張表
  • 點(diǎn)贊一張表
  • 評(píng)論一張表
  • 收藏一張表
  • 信息提醒一張表
    • 用戶消息的查看與否以及數(shù)目在移動(dòng)端的顯示,需要在消息表設(shè)置加上是否查看了的字段,可以解決以下幾個(gè)問題:
      • 用戶在卸載APP再安裝時(shí),不會(huì)造成查看混亂,例如之前看過的,又顯示出來
      • 在每次用戶進(jìn)入APP的時(shí)候,可以很好地顯示出新的消息,不會(huì)造成過于復(fù)雜的邏輯代碼判斷
  • 用戶信息兩張表
    • 賬號(hào)信息一張,存賬號(hào)、密碼、注冊時(shí)間、ip等
    • 基本信息一張,存簽名、頭像鏈接、背景圖片鏈接等
4,接口
  • 數(shù)據(jù)傳輸格式
    json array 或 字符串
  • 訪問頻繁的數(shù)據(jù)
    架多一層 Redis,一定程度緩解高并發(fā),需要服務(wù)器的內(nèi)存支持
  • 代碼
    • 封裝一個(gè)自定義的 Redis 操作類
    • 封裝一個(gè)基于事務(wù)的數(shù)據(jù)庫連接類,方便使用
    • 封裝一個(gè)用戶信息類,專門用來處理用戶的信息插入與獲取

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多