Fetch 是一個簡單、強大、可自訂的 Android 檔案下載管理器庫。
簡單易用的API。
在背景持續下載。
支援並發下載。
能夠暫停和恢復下載。
設定下載的優先順序。
特定於網路的下載支援。
能夠重試失敗的下載。
能夠對下載進行分組。
輕鬆的進度和狀態追蹤。
下載剩餘時間報告 (ETA)。
下載速度報告。
隨時保存和檢索下載資訊。
通知支援。
儲存存取框架、內容提供者和 URI 支援。
還有更多...
如果您在應用程式的沙箱之外儲存下載內容,則需要將下列儲存權限新增至應用程式的清單中。對於 Android SDK 版本 23(M) 及更高版本,您還需要向使用者明確要求這些權限。
另外,因為您將使用網路下載檔案。我們需要在Manifest中加入Internet存取權限。
使用 Fetch 很簡單!只需將 Gradle 依賴項新增至應用程式的 build.gradle 檔案中即可。
實現“com.tonyodev.fetch2:fetch2:3.0.12”
Androidx使用:
實作“androidx.tonyodev.fetch2:xfetch2:3.1.6”
接下來,取得 Fetch 的實例並要求下載。
公用類別 TestActivity 擴充 AppCompatActivity { 私人 Fetch fetch; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(3) 。 fetch = Fetch.Impl.getInstance(fetchConfiguration); 字串 url = "http://www.example.com/test.txt"; 字串檔案=“/downloads/test.txt”; 最終請求請求=新請求(url,文件); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, UpdatedRequest -> { //請求已成功入隊下載。 }, error -> { //將請求排隊時發生錯誤。 }); } }
使用 Fetch 可以非常輕鬆地追蹤下載進度和狀態。只需將 FetchListener 新增至 Fetch 實例,只要下載狀態或進度變化,偵聽器就會收到通知。
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Download download, boolean waitingOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download) }; } } @Override public void onCompleted(@NotNull Download download) { } @Override public void onError(@NotNull Download download) { 錯誤 error = download.getError(); } @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload( int 進度 = download.getProgress(); } @Override public void onPaused(@NotNull Download 下載) { } @Override public void onResumed(@NotNull Download 下載) { } @Override public void onCancelled(@NotNull Download 下載) { } @Override public void onRemoved(@NotNull 下載 download) { } @Override public void onDeleted(@NotNull 下載 download) { } };fetch.addListener(fetchListener);//done時移除監聽器.fetch.removeListener(fetchListener);
Fetch 支援使用請求 ID 暫停和恢復下載。請求的 id 是將請求對應到取得下載的唯一識別碼。 Fetch 傳回的下載將有一個與開始下載的請求 ID 相符的 ID。
請求 request1 = new Request(url, file);請求 request2 = new Request(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
您可以透過多種方式查詢 Fetch 下載資訊。
//查詢所有下載fetch.getDownloads(new Func>() { @Override public void call(List extends Download> downloads) { //此處存取所有下載 } });//透過statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List extends Download> downloads) { //存取下載取得所有下載正在下載的 } });// 也可以存取分組下載sint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> downloads) { @Override public void call(List extends Download> 下載> /訪問分組下載 } });
當您使用完 Fetch 實例後,只需釋放它即可。
//do workfetch.close();//做更多工作
預設情況下,Fetch 透過 HttpUrlConnectionDownloader 使用 HttpUrlConnection 用戶端來下載請求。將以下 Gradle 依賴項新增至應用程式的 build.gradle 以改用 OkHttp Downloader。如有必要,您可以建立自訂下載器。有關詳細信息,請參閱 Java 文件。
實現“com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12”
Androidx使用:
實作“androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6”
設定要使用的 Fetch 的 OkHttp Downloader。
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(new OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
如果您想在使用 Fetch 時利用 RxJava2 功能,請將以下 gradle 依賴項新增至應用程式的 build.gradle 檔案中。
實作“com.tonyodev.fetch2rx:fetch2rx:3.0.12”
Androidx使用:
實作“androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6”
RxFetch 讓使用 rxJava2 函數方法對下載請求進行排隊和查詢下載變得非常容易。
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void receive(List
downloads) throws Exception { //存取結果 } }, new Consumer () { @Override public void receive(Throwable throwable) throws Exception { //發生錯誤final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
介紹 FetchFileServer。 FetchFileServer 是一個輕量級 TCP 檔案伺服器,其作用類似於專門為在 Android 裝置之間共用檔案而設計的 HTTP 檔案伺服器。您可以在一台裝置上使用 FetchFileServer 託管檔案資源,並且必須從另一台裝置上的伺服器取得下載檔案。請參閱範例應用程式以獲取更多資訊。 FetchFileServer 上的 Wiki 將在未來幾天內新增。
透過將 gradle 依賴項新增至應用程式的 build.gradle 檔案中開始使用 FetchFileServer。
實作“com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12”
Androidx使用:
實作“androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6”
啟動 FetchFileServer 實例並新增它可以為連接的客戶端提供服務的資源檔案。
公共類別 TestActivity 擴充 AppCompatActivity { FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = new FetchFileServer.Builder(this) 。 fetchFileServer.start(); //監聽客戶端連線 File file = new File("/downloads/testfile.txt"); FileResource fileResource = new FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protected void onDestroy() { super.onDestroy(); fetchFileServer.shutDown(假); } }
使用 Fetch 從 FetchFileServer 下載檔案非常簡單。
公共類別 TestActivity 擴充 AppCompatActivity { 取得 fetch; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setFileServerDownloader(new FetchFileServerDownloader()) //必須設定檔案伺服器下載器 。 fetch = Fetch.Impl.getInstance(fetchConfiguration); fetch.addListener(fetchListener); 字串檔案=“/downloads/sample.txt”; 字串 url = new FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //檔案伺服器ip和連接埠 .setFileResourceIdentifier("testfile.txt") //檔案資源名稱或id 。 請求 request = new Request(url, 檔案); fetch.enqueue(request, request1 -> { //請求排隊等待下載 }, error -> { //排隊下載時出錯 }); } @Override protected void onResume() { super.onResume(); fetch.addListener(fetchListener); } @Override protected void onPause() { super.onPause(); fetch.removeListener(fetchListener); } @Override protected void onDestroy() { super.onDestroy(); fetch.close(); } private FetchListener fetchListener = new AbstractFetchListener() { @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadBytesPerSecond) { super.onProgress(downloadload, etaSeconds)(download, etaSecond)] Log.d("TestActivity", "進度:" + download.getProgress()); } @Override public void onError(@NotNull Download download) { super.onError(download); Log.d("TestActivity", "錯誤:" + download.getError().toString()); } @Override public void onCompleted(@NotNull Download download) { super.onCompleted(download); Log.d("TestActivity", "已完成"); } }; }
使用遷移助理將下載從 Fetch1 遷移到 Fetch2。將下列 gradle 依賴項新增至應用程式的 build.gradle 檔案中。
實作“com.tonyodev.fetchmigrator:fetchmigrator:3.0.12”
Androidx使用:
實作“androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6”
然後運行遷移器。
if (!didMigrationRun()) { //遷移必須在後台執行緒上執行 new Thread(new Runnable() { @Override public void run() { try { Final ListTransferDownloads = FetchMigrator.migrateFromV112(getlipromV112(getli) APP_FETCH_NAMESPACE); //TODO: 更新ids 的外部引用for (DownloadTransferPair TransferDownload : TransferDownloads) { Log.d("newDownload", TransferDownload.getNewDownload().toString()); , TransferDownload.getOID(Download."ID(Down); FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(true); //遷移後設定並運行Fetch2 } catch (SQLException e) { e.printStackTrace(); } } })。 } else { //正常設定並執行Fetch2 }
只有貢獻程式碼,Fetch 才會變得更好。發現錯誤?報告一下。您有想在 Fetch 中看到的功能創意嗎?為專案做出貢獻!
Copyright (C) 2017 Tonyo Francis. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.