Fetch adalah pustaka pengelola unduhan file yang sederhana, kuat, dan dapat disesuaikan untuk Android.
API yang sederhana dan mudah digunakan.
Pengunduhan terus menerus di latar belakang.
Dukungan pengunduhan secara bersamaan.
Kemampuan untuk menjeda dan melanjutkan pengunduhan.
Tetapkan prioritas unduhan.
Dukungan pengunduhan khusus jaringan.
Kemampuan untuk mencoba lagi unduhan yang gagal.
Kemampuan untuk mengelompokkan unduhan.
Kemajuan mudah dan pelacakan status.
Unduh pelaporan sisa waktu (ETA).
Unduh pelaporan kecepatan.
Simpan dan Ambil informasi unduhan kapan saja.
Dukungan Pemberitahuan.
Kerangka Akses Penyimpanan, Penyedia Konten, dan dukungan URI.
Dan banyak lagi...
Jika Anda menyimpan unduhan di luar sandbox aplikasi, Anda perlu menambahkan izin penyimpanan berikut ke manifes aplikasi Anda. Untuk Android SDK versi 23(M) dan yang lebih baru, Anda juga perlu meminta izin ini secara eksplisit dari pengguna.
Juga, karena Anda akan menggunakan Internet untuk mengunduh file. Kita perlu menambahkan izin akses Internet di Manifest.
Menggunakan Ambil itu mudah! Cukup tambahkan ketergantungan Gradle ke file build.gradle aplikasi Anda.
implementasi "com.tonyodev.fetch2:fetch2:3.0.12"
Penggunaan Androidx:
implementasi "androidx.tonyodev.fetch2:xfetch2:3.1.6"
Selanjutnya, dapatkan instance Ambil dan minta unduhan.
kelas publik TestActivity extends AppCompatActivity { pengambilan pribadi; @Override dilindungi kekosongan onCreate(@Nullable Bundel disimpanInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration FetchConfiguration = FetchConfiguration.Builder baru (ini) .setDownloadConcurrentLimit(3) .membangun(); ambil = Ambil.Impl.getInstance(fetchConfiguration); String url = "http:www.example.com/test.txt"; String file = "/downloads/test.txt"; permintaan Permintaan terakhir = Permintaan baru (url, file); request.setPriority(Prioritas.TINGGI); permintaan.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); ambil.enqueue(permintaan, updateRequest -> {/ //Permintaan berhasil dimasukkan dalam antrean untuk diunduh. }, error -> { //Terjadi kesalahan saat mengantri permintaan. }); } }
Melacak kemajuan dan status unduhan sangat mudah dengan Fetch. Cukup tambahkan FetchListener ke instance Fetch Anda, dan pendengar akan diberi tahu setiap kali status atau kemajuan unduhan berubah.
FetchListener FetchListener = new FetchListener() { @Override public void onQueued(@NotNull Unduh unduh, boolean waitingOnNetwork) { if (request.getId() == unduh.getId()) { showDownloadInList(unduh); } } @Override public void onCompleted(@NotNull Unduh unduhan) { } @Override public void onError(@NotNull Unduh unduh) { Kesalahan error = download.getError(); } @Override public void onProgress(@NotNull Unduh unduh, etaInMilliSeconds yang panjang, BytesPerSecond yang sudah lama diunduh) { if (request.getId() == unduh.getId()) { updateDownload(unduh, etaInMilliSeconds); } int kemajuan = unduh.getProgress(); } @Override public void onPaused(@NotNull Unduh unduhan) { } @Override public void onResumed(@NotNull Unduh unduh) { } @Override public void onCancelled(@NotNull Unduh unduh) { } @Override public void onRemoved(@NotNull Unduh unduh) { } @Override public void onDeleted(@NotNull Unduh unduhan) { } };fetch.addListener(fetchListener);//Hapus pendengar setelah selesai.fetch.removeListener(fetchListener);
Fetch mendukung jeda dan melanjutkan unduhan menggunakan id permintaan. Id permintaan adalah pengidentifikasi unik yang memetakan permintaan ke Ambil Unduhan. Unduhan yang dikembalikan oleh Fetch akan memiliki id yang cocok dengan id permintaan yang memulai pengunduhan.
Permintaan permintaan1 = Permintaan baru(url, file);Permintaan permintaan2 = Permintaan baru(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
Anda dapat menanyakan Ambil untuk informasi pengunduhan dalam beberapa cara.
//Kueri semua downloadsfetch.getDownloads(new Func>() { @Override public void call(List extends Download> downloads) { //Akses semua download di sini } });//Dapatkan semua unduhan dengan statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List extends Download> downloads) { //Akses unduhan yang sedang mengunduh } });// Anda juga dapat mengakses unduhan yang dikelompokkansint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List extends Download> downloads) { / /Akses unduhan yang dikelompokkan } });
Ketika Anda selesai dengan sebuah instance Fetch, lepaskan saja.
//melakukan workfetch.close();//melakukan lebih banyak pekerjaan
Secara default Fetch menggunakan klien HttpUrlConnection melalui HttpUrlConnectionDownloader untuk mengunduh permintaan. Tambahkan dependensi Gradle berikut ke build.gradle aplikasi Anda untuk menggunakan OkHttp Downloader. Anda dapat membuat pengunduh khusus jika perlu. Lihat dokumen Java untuk detailnya.
implementasi "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
Penggunaan Androidx:
implementasi "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
Atur OkHttp Downloader untuk digunakan Ambil.
OkHttpClient okHttpClient = baru OkHttpClient.Builder().build();FetchConfiguration FetchConfiguration = FetchConfiguration.Builder baru(ini) .setDownloadConcurrentLimit(10) .setHttpDownloader(OkHttpDownloader baru(okHttpClient)) .build();Ambil ambil = Ambil.Impl.getInstance(fetchConfiguration);
Jika Anda ingin memanfaatkan fitur RxJava2 saat menggunakan Fetch, tambahkan dependensi gradle berikut ke file build.gradle aplikasi Anda.
implementasi "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
Penggunaan Androidx:
implementasi "androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6"
RxFetch membuatnya sangat mudah untuk mengantrekan permintaan unduhan dan meminta unduhan menggunakan metode fungsional 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) melempar Pengecualian { //Akses hasil } }, Konsumen baru () { @Override public void menerima(Throwable throwable) throws Exception { //Terjadi kesalahan final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
Memperkenalkan FetchFileServer. FetchFileServer adalah Server File TCP ringan yang bertindak seperti server file HTTP yang dirancang khusus untuk berbagi file antar perangkat Android. Anda dapat menghosting sumber daya file dengan FetchFileServer di satu perangkat dan harus mengambil File unduhan dari server di perangkat lain. Lihat contoh aplikasi untuk informasi lebih lanjut. Wiki di FetchFileServer akan ditambahkan dalam beberapa hari mendatang.
Mulai gunakan FetchFileServer dengan menambahkan ketergantungan gradle ke file build.gradle aplikasi Anda.
implementasi "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
Penggunaan Androidx:
implementasi "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
Mulai instance FetchFileServer dan tambahkan file sumber daya yang dapat digunakan untuk klien yang terhubung.
kelas publik TestActivity memperluas AppCompatActivity { FetchFileServer ambilFileServer; @Override dilindungi kekosongan onCreate(@Nullable Bundel disimpanInstanceState) { super.onCreate(savedInstanceState); ambilFileServer = FetchFileServer.Builder baru(ini) .membangun(); ambilFileServer.mulai(); //mendengarkan koneksi klien File file = new File("/downloads/testfile.txt"); FileResource fileResource = FileResource baru(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("fileuji.txt"); fileResource.setId(UUID.randomUUID().hashCode()); ambilFileServer.addFileResource(fileResource); } @Override dilindungi void onDestroy() { super.onDestroy(); ambilFileServer.shutDown(salah); } }
Mengunduh file dari FetchFileServer menggunakan Fetch itu mudah.
public class TestActivity extends AppCompatActivity { Ambil ambil; @Override dilindungi kekosongan onCreate(@Nullable Bundel disimpanInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration FetchConfiguration = FetchConfiguration.Builder baru (ini) .setFileServerDownloader(new FetchFileServerDownloader()) //harus menyetel pengunduh server file .membangun(); ambil = Ambil.Impl.getInstance(fetchConfiguration); ambil.addListener(fetchListener); String file = "/downloads/sample.txt"; String url = baru FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //ip dan port server file .setFileResourceIdentifier("testfile.txt") // nama atau id sumber daya file .membuat(); Permintaan permintaan = Permintaan baru (url, file); ambil.enqueue(permintaan, permintaan1 -> {/ //Permintaan dalam antrean untuk diunduh }, error -> { //Kesalahan saat mengantri unduhan }); } @Override dilindungi void onResume() { super.onResume(); ambil.addListener(fetchListener); } @Override dilindungi void onPause() { super.onPause(); ambil.removeListener(fetchListener); } @Override dilindungi void onDestroy() { super.onDestroy(); ambil.tutup(); } private FetchListener ambilListener = new AbstrakFetchListener() { @Override public void onProgress(@NotNull Unduh unduh, etaInMilliSeconds panjang, panjang unduhBytesPerSecond) { super.onProgress(unduh, etaInMilliSeconds, downloadBytesPerSecond); Log.d("TestActivity", "Kemajuan: " + download.getProgress()); } @Override public void onError(@NotNull Unduh unduh) { super.onError(unduh); Log.d("TestActivity", "Kesalahan: " + download.getError().toString()); } @Override public void onCompleted(@NotNull Unduh unduh) { super.onCompleted(unduh); Log.d("TestActivity", "Selesai"); } }; }
Migrasikan unduhan dari Fetch1 ke Fetch2 menggunakan asisten migrasi. Tambahkan ketergantungan gradle berikut ke file build.gradle aplikasi Anda.
implementasi "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
Penggunaan Androidx:
implementasi "androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6"
Kemudian jalankan Migrator.
if (!didMigrationRun()) { //Migrasi harus berjalan di thread latar belakang new Thread(new Runnable() { @Override public void run() { coba { final ListditransferDownloads = FetchMigrator.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: perbarui referensi eksternal id untuk (DownloadTransferPair ditransferDownload : ditransferDownloads) { Log.d("newDownload", ditransferDownload.getNewDownload().toString()); Log.d("oldId di Fetch v1", ditransferDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(benar); //Siapkan dan Jalankan Fetch2 setelah migrasi } menangkap (SQLException e) { e.printStackTrace(); } } }).awal(); } else { //Siapkan dan Jalankan Fetch2 secara normal }
Pengambilan hanya bisa menjadi lebih baik jika Anda memberikan kontribusi kode. Menemukan bug? Laporkan. Punya ide fitur yang ingin Anda lihat di Fetch? Berkontribusi pada proyek ini!
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.