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(download, etaInMilliSeconds); } 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) { / /访问分组下载 } });
当您使用完 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(download, etaInMilliSeconds, downloadBytesPerSecond); } 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.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: 更新 (DownloadTransferPair) 的 ids 外部引用TransferDownload : TransferDownloads) { Log.d("newDownload", TransferDownload.getNewDownload().toString()); Log.d("Fetch v1 中的 oldId", TransferDownload.getOldID() + ""); 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.