最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

圖形引擎實戰(zhàn):手游Android端后臺下載技術(shù)分享

2023-03-13 08:00 作者:搜狐暢游引擎部  | 我要投稿

一.功能特點

手游android端后臺下載SDK是暢游自主研發(fā)的一款移動平臺android端后臺文件下載工具包,它主要提供網(wǎng)絡文件的后臺下載功能,功能完善,性能高,可以滿足游戲制作有關(guān)后臺下載文件的需求。使用該系統(tǒng),玩家可以不用等待漫長的前臺下載過程,只需切換到后臺就可以下載文件,極大提升用戶體驗,具有以下特點:

  1. 支持后臺下載,用戶開啟下載后,將游戲切換到后臺,下載繼續(xù)進行,不中斷、不閃退

  2. 支持大規(guī)模文件的后臺下載,支持了上萬個文件的后臺下載

  3. 適配度高,最低支持到android5.0, 同時也支持模擬器

  4. 支持大文件的下載,通過采用切割技術(shù),開多個線程同時下載各個片段,最后實現(xiàn)整個文件的下載

  5. 下載速度最快達到每秒10M以上

  6. 采用多線程技術(shù),可以同時下載多個文件

  7. 支持限速功能,在寬帶受限的情況下,用戶可以限制下載速度,不影響其它app的使用

  8. 斷點續(xù)傳技術(shù),用戶可以隨時暫停下載,或者在下載失敗后,后續(xù)可以繼續(xù)下載

  9. 支持斷線重連

  10. 通知欄顯示下載進度條,下載完成后,只要不點擊通知欄,app一直駐留不閃退

二.主要技術(shù)原理

后臺下載

首先,我們說一下普通的下載,就是根據(jù)客戶端提供的某個文件在服務端的地址,使用http連接技術(shù),將這個文件下載到本地,支持http和https兩種url地址。

那什么是后臺下載呢?后臺下載和普通下載有什么不同?

所謂的后臺下載,就是將手機切換到后臺以后,我們的下載仍然可以正常運行,用戶啟動后臺下載后,可以打開其它app,一邊看著新聞,聊著天,一邊后臺跑著下載程序,兩不耽誤。

前臺下載是無法實現(xiàn)這個功能的,只要你切換到后臺,下載就停止了。

我們的后臺下載技術(shù),基于android自帶的下載模塊實現(xiàn),啟動下載后,將游戲切換到后臺,下載繼續(xù)進行,不中斷、不閃退。

第一步,實現(xiàn)一個普通的下載DownTask

Class DownloadTask extends Thread

{

@Override

public void run()

{

根據(jù)url獲得遠程鏈接

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

int timeout = 10;

conn.setConnectTimeout(timeout * 1000);

conn.setReadTimeout(timeout * 1000);

conn.setRequestMethod("GET");


然后,獲得數(shù)據(jù)流,并讀取數(shù)據(jù)到文件里

InputStream inputStream = conn.getInputStream();

int bytesRead = -1;

byte[] readBuf = new byte[1024];

bytesRead = inputStream.read(readBuf);

while(bytesRead != -1)

{

raf.write(readBuf, 0, bytesRead);

。。。。。。

}

}

}

第二步,將下載嵌入到嵌入到android系統(tǒng)service框架內(nèi),通過將下載模塊嵌入到service內(nèi),完成后臺下載邏輯,可以實現(xiàn)下載程序的后臺運行。

public class DownloadService extends Service

{

@Override

public int onStartCommand(Intent intent, int flags, int startId)

{

if(intent != null)

{

int downloadId = intent.getIntExtra("downloadId",0);

String url = intent.getStringExtra("url");

String downloadPath = intent.getStringExtra("downloadPath");

DownloadFileInfo fileInfo = new DownloadFileInfo(url, downloadPath);

DownloadTask task = new DownloadTask( fileInfo,maxBandwidth);

task.download();

}

}

}

第三步,啟動service

Intent intent = new Intent(context, DownloadService.class);

intent.putExtra("downloadId",needInfo._downloadId);

intent.putExtra("url",needInfo._url)

intent.putExtra("downloadPath",needInfo._downloadPath);

context.startService(intent);

通過以上幾步,一個后臺下載,就跑起來了。

斷點續(xù)傳

對于一個幾個G,幾十G的大文件來說, 斷點續(xù)傳是必須要有的功能。當我們下載了一半的時候,手機沒電了,或者網(wǎng)絡斷了,或者游戲閃退了,如果沒有斷點續(xù)傳,那就悲劇了,重新啟動下載,就會重新開始下載,不僅浪費了時間,浪費了電量,還浪費了流量,這對用戶是不可接受的。而有了斷點續(xù)傳就好多了,我們再也不用擔心下載過程中發(fā)生各種意外了。

斷點續(xù)傳是怎么實現(xiàn)的呢?android系統(tǒng)的http模塊支持片段下載,我們可以把每次下載的起始點、偏移量等數(shù)據(jù)保存到本地,然后,每次啟動下載,首先查詢之前有沒有下載過,下載記錄里如果以前下載過,那我們就從上次下載的位置接著下載;沒有下載過則從頭下載。下載開始后,用戶可以隨時暫停下載、關(guān)閉下載,或者在下載失敗后,后續(xù)可以繼續(xù)下載。


多線程的應用

線程是進程中的一個執(zhí)行單元,負責當前進程中程序的執(zhí)行,一個進程中至少有一個線程。進程中如果包含多個線程在同時運行,就是多線程了,在多線程運行環(huán)境下,所有線程輪流使用 CPU 的使用權(quán),根據(jù)優(yōu)先級,給每個線程分配占用 CPU 的時間。

游戲里的資源,不壓縮的散文件有上萬個,壓縮到幾個大文件,每個文件,也是好幾個G大。不管是散文件,還是大文件,如果把下載任務放到主線程里,那游戲體驗非常不好,不僅卡頓,下載的時候,還干不了別的?;谶@些,多線程技術(shù)的使用,是必選的了。

采用多線程技術(shù),一方面,上萬個文件需要下載,速度不夠高。沒啥好辦法,多開幾個下載隊列,同時下載,實現(xiàn)了多個文件的同時下載。另一方面,幾個G的單一大文件,速度不夠高。在單文件下載性能優(yōu)化無法提高的情況下,可以將幾個G的大文件切割成若干不同片端,每個片段開一個線程來分別下載各個片段,然后幾個線程同時下載,最后實現(xiàn)整個文件的下載,極大提高了大文件的下載速度,通過實測,下載速度最快達到每秒十幾M。


推送通知

通知欄顯示采用操作系統(tǒng)原生API接口實現(xiàn),創(chuàng)建通知的基本步驟如下:

使用getSystemService 拿到 NotificationManager 的管理類,使用Notification 設置標題、內(nèi)容、圖片等,最后調(diào)用 NotificationManager 的 notify() 調(diào)出通知欄

由于android手機不同品牌,版本不一致,而且有的大廠(華為,oppo,三星、小米等)的操作系統(tǒng)沒有跟隨google版本走,自己再維護一套,導致通知欄的顯示,在不同品牌手機,不同版本上的表現(xiàn)不一致,最后通過適配來解決差異性。

三.代碼結(jié)構(gòu)

代碼分為3層結(jié)構(gòu)

底層:

采用java語言,調(diào)用android原生API實現(xiàn),提供aar文件

1.TakeDownload對外開放接口,對內(nèi)向DownloadEngine傳遞參數(shù)

2.DownloadEngine是下載管理器,負責下載隊列的創(chuàng)建、管理,下載文件的收集、管理,回調(diào)消息的發(fā)布。通過創(chuàng)建若干下載隊列,采用多線程,幾個隊列同時下載文件。

3.downloadService負責下載任務的創(chuàng)建,管理,

4.DownloadTask,負責單個文件的下載

5.LocalData,負責本地數(shù)據(jù)存儲,將每個文件的下載狀態(tài)信息保存下來

6.NotificationBar,負責通知欄顯示

中間層:

采用C#語言,封裝底層接口實現(xiàn)各個功能,然后,向上層提供調(diào)用接口,提供dll文件

邏輯層:采用C#語言,調(diào)用中間層提供的接口,實現(xiàn)相關(guān)功能

四.開發(fā)中遇到的難點及解決辦法

從設計開發(fā)初期,到項目實際使用中,斷斷續(xù)續(xù),遇到了很多的問題,其中有幾個典型問題,這里記錄了下來。

1.在某些低端機上,存在內(nèi)存不足的問題。這個,不管在什么檔次的設備上,內(nèi)存消耗,永遠是個問題。需要盡量減少內(nèi)存泄漏,釋放短期內(nèi)不用的內(nèi)存,還有,可以使用內(nèi)存池來減少碎片。

2.弱網(wǎng)環(huán)境下,網(wǎng)絡時好時壞,導致下載經(jīng)常失敗。網(wǎng)絡斷開,經(jīng)常會遇到。后來,加了一個重復下載機制。每個文件,都可以嘗試下載三次,超過三次以上,還沒有下載成功,就認為是失敗,直接返回給上層,由上層來彈出提示框,等待用戶決定,是否重新下載。

3.上萬個文件需要下載,速度不夠高。沒啥好辦法,多開幾個下載隊列,同時下載。項目使用過程,建議把這些小文件壓縮到若干個大文件,可以提高速度。

4.幾個G的單一大文件,速度不夠高。在單文件下載性能優(yōu)化無法提高的情況下,可以把文件切割成若干片段,每個片段開一個線程,然后幾個線程同時下載。

5.通知欄在很多設備上出現(xiàn)異常,表現(xiàn)不一。不同設備,操作系統(tǒng)版本號不同,而且,有的機型,即使版本號一樣,但由于自己對系統(tǒng)做了修改而有差異,需要做適配。

6.文件下載到本地后,需要進行md5、crc等文件校驗。項目在驗證的過程中,出現(xiàn)了一個所有人沒有想到的小插曲,就是在所有文件下載完畢后,他們直接進入手機目錄下,手動將下載的文件拷貝到了電腦里,然后用文件比較工具,比較下載文件和源文件的二進制內(nèi)容,發(fā)現(xiàn)很多文件都不同。這個問題,當時我和另一個同事,都被搞懵了,因為demo里有md5校驗都是對的,但是把文件手動拷出來比較就不對,我們投入了兩個工作日時間去查找問題,怎么也查不到。最后,發(fā)現(xiàn)是手機操作系統(tǒng)做了文件保護機制,如果手動拷貝文件,拷出來的文件已經(jīng)發(fā)生了變化。后來,我們是通過手機助手軟件來導出了文件,經(jīng)過和源文件比較,才驗證了文件的正確性。

7.還遇到個問題,項目在測試的時候,他們先下載一半的時候中途退出程序,然后手動進入手機目錄下,把下載目錄給刪除掉,接著,重新啟動下載,出現(xiàn)了文件下載完后md5校驗不對的問題,而且是必現(xiàn)的。之前,一直沒有這么測試過,也就從來沒有發(fā)現(xiàn)這個問題。這個問題主要是因為下載的文件和數(shù)據(jù)庫文件不在同一個目錄下,中途刪除下載目錄的時候,沒有把另一個目錄下的記錄文件下載進度的數(shù)據(jù)庫文件給刪掉,導致啟動下載的時候,會首先查找文件下載進度,查找到有個文件下載了一半,然后就從一半的位置接著下載,然后就出現(xiàn)了文件校驗不對的問題。知道了問題所在,就好修復了。在每次下載某個文件的時候,如果數(shù)據(jù)庫里有這個文件的下載進度記錄的時候,再查找一下本地是否有這個文件,如果沒有就把數(shù)據(jù)庫里的這條記錄給清空了。


歡迎加入我們!

感興趣的同學可以投遞簡歷至:CYouEngine@cyou-inc.com


圖形引擎實戰(zhàn):手游Android端后臺下載技術(shù)分享的評論 (共 條)

分享到微博請遵守國家法律
贵阳市| 漳平市| 新兴县| 通许县| 镇坪县| 平昌县| 长兴县| 临沂市| 新宁县| 宜宾市| 黔西县| 馆陶县| 比如县| 岗巴县| 商南县| 太保市| 石棉县| 安西县| 清丰县| 安乡县| 大冶市| 栖霞市| 郎溪县| 林甸县| 邢台市| 新丰县| 乳山市| 长春市| 西林县| 垦利县| 偏关县| 荆门市| 珲春市| 宁城县| 新乡市| 九台市| 民和| 安吉县| 北票市| 太康县| 长治市|