Fetch は、シンプルで強力、カスタマイズ可能な Android 用のファイル ダウンロード マネージャー ライブラリです。
シンプルで使いやすいAPI。
バックグラウンドでの継続的なダウンロード。
同時ダウンロードのサポート。
ダウンロードを一時停止および再開する機能。
ダウンロードの優先順位を設定します。
ネットワーク固有のダウンロードのサポート。
失敗したダウンロードを再試行する機能。
ダウンロードをグループ化する機能。
進捗とステータスの追跡が簡単。
残り時間レポート (ETA) をダウンロードします。
ダウンロード速度レポート。
ダウンロード情報をいつでも保存して取得できます。
通知サポート。
ストレージ アクセス フレームワーク、コンテンツ プロバイダー、および URI のサポート。
さらに...
ダウンロードをアプリケーションのサンドボックスの外に保存する場合は、アプリケーションのマニフェストに次のストレージ権限を追加する必要があります。 Android SDK バージョン 23(M) 以降の場合は、ユーザーにこれらのアクセス許可を明示的に要求する必要もあります。
また、ファイルのダウンロードにはインターネットを使用します。マニフェストにインターネット アクセス許可を追加する必要があります。
Fetch の使用は簡単です。 Gradle の依存関係をアプリケーションの build.gradle ファイルに追加するだけです。
実装「com.tonyodev.fetch2:fetch2:3.0.12」
Androidx の使用:
実装「androidx.tonyodev.fetch2:xfetch2:3.1.6」
次に、Fetch のインスタンスを取得し、ダウンロードをリクエストします。
public class TestActivity extends AppCompatActivity { private Fetch fetch; @Override protected void onCreate(@Nullable Bundle SavedInstanceState) { 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"; 最終リクエスト request = new Request(url, file); 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 waitOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download); } @Override public void onCompleted(@NotNull 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 progress = 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 ダウンロード ダウンロード) { } };fetch.addListener(fetchListener);//完了したらリスナーを削除します。fetch.removeListener(fetchListener);
Fetch は、リクエストの ID を使用したダウンロードの一時停止と再開をサポートしています。リクエストの ID は、リクエストをダウンロードの取得にマップする一意の識別子です。 Fetch によって返されるダウンロードには、ダウンロードを開始したリクエスト ID と一致する ID が含まれます。
リクエスト request1 = 新しいリクエスト (url, file);リクエスト request2 = 新しいリクエスト (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 のインスタンスの使用が完了したら、それを解放するだけです。
// workfetch.close() を実行します;// さらに作業を実行します
デフォルトでは、Fetch は HttpUrlConnectionDownloader 経由で HttpUrlConnection クライアントを使用してリクエストをダウンロードします。代わりに OkHttp Downloader を使用するには、次の Gradle 依存関係をアプリケーションの build.gradle に追加します。必要に応じて、カスタム ダウンローダーを作成できます。詳細については、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(新しい OkHttpDownloader(okHttpClient)) .build();フェッチ fetch = Fetch.Impl.getInstance(fetchConfiguration);
Fetch の使用時に RxJava2 機能を利用したい場合は、アプリケーションの build.gradle ファイルに次の 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 accept(List
downloads) throws Exception { //結果にアクセスする } }, new Consumer () { @Override public void accept(Throwable throwable) throws Exception { //エラーが発生しました Final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
FetchFileServer の紹介。 FetchFileServer は、Android デバイス間でファイルを共有するために特別に設計された HTTP ファイル サーバーのように機能する軽量の TCP ファイル サーバーです。あるデバイス上の FetchFileServer を使用してファイル リソースをホストし、別のデバイス上のサーバーからダウンロード ファイルをフェッチする必要があります。詳細については、サンプル アプリを参照してください。 FetchFileServer に関する Wiki は数日以内に追加される予定です。
アプリケーションの build.gradle ファイルに gradle 依存関係を追加して、FetchFileServer の使用を開始します。
実装「com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12」
Androidx の使用:
実装「androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6」
FetchFileServer インスタンスを開始し、接続されたクライアントに提供できるリソース ファイルを追加します。
public class TestActivity extends AppCompatActivity { FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle SavedInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = 新しい 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(false); } }
Fetch を使用して FetchFileServer からファイルをダウンロードするのは簡単です。
public class TestActivity extends AppCompatActivity { Fetch fetch; @Override protected void onCreate(@Nullable Bundle SavedInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setFileServerDownloader(new FetchFileServerDownloader()) //ファイル サーバー ダウンローダーを設定する必要があります 。建てる(); fetch = Fetch.Impl.getInstance(fetchConfiguration); fetch.addListener(fetchListener); 文字列ファイル = "/downloads/sample.txt"; 文字列 URL = 新しい FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //ファイルサーバーのIPとポート .setFileResourceIdentifier("testfile.txt") //ファイルリソース名またはID 。作成する(); リクエスト request = new Request(url, file); 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 ダウンロード、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", "Completed "); } }; }
移行アシスタントを使用して、ダウンロードを 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 ListrequestedDownloads = FetchMigrator.mergeFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: (DownloadTransferPair transferDownload の ID の外部参照を更新します:転送されたダウンロード) { Log.d("新しいダウンロード", 転送されたDownload.getNewDownload().toString()); Log.d("フェッチ v1 の古い ID", 転送されたDownload.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.