Fetch عبارة عن مكتبة مدير تنزيل ملفات بسيطة وقوية وقابلة للتخصيص لنظام Android.
واجهة برمجة التطبيقات (API) بسيطة وسهلة الاستخدام.
التنزيل المستمر في الخلفية.
دعم التنزيل المتزامن.
القدرة على إيقاف واستئناف التنزيلات.
تحديد أولوية التنزيل.
دعم التنزيل الخاص بالشبكة.
القدرة على إعادة محاولة التنزيلات الفاشلة.
القدرة على تجميع التنزيلات.
سهولة التقدم وتتبع الحالة.
قم بتنزيل تقارير الوقت المتبقي (ETA).
تحميل تقرير السرعة.
حفظ واسترجاع معلومات التنزيل في أي وقت.
دعم الإخطار.
إطار الوصول إلى التخزين وموفر المحتوى ودعم URI.
وأكثر...
إذا كنت تقوم بحفظ التنزيلات خارج وضع الحماية لتطبيقك، فستحتاج إلى إضافة أذونات التخزين التالية إلى بيان تطبيقك. بالنسبة لنظام التشغيل Android SDK الإصدار 23 (M) والإصدارات الأحدث، ستحتاج أيضًا إلى طلب هذه الأذونات بشكل صريح من المستخدم.
أيضًا، لأنك ستستخدم الإنترنت لتنزيل الملفات. نحن بحاجة إلى إضافة أذونات الوصول إلى الإنترنت في البيان.
استخدام الجلب سهل! ما عليك سوى إضافة تبعية Gradle إلى ملف build.gradle الخاص بتطبيقك.
تنفيذ "com.tonyodev.fetch2:fetch2:3.0.12"
استخدام اندرويد اكس:
تنفيذ "androidx.tonyodev.fetch2:xfetch2:3.1.6"
بعد ذلك، احصل على مثيل Fetch واطلب التنزيل.
public class TestActivity يمتد AppCompatActivity { جلب خاص؛ @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = جديد FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(3) .يبني()؛ fetch = Fetch.Impl.getInstance(fetchConfiguration); عنوان URL للسلسلة = "http:www.example.com/test.txt"; ملف السلسلة = "/downloads/test.txt"؛ طلب الطلب النهائي = طلب جديد(url, file); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, UpdateRequest -> { // تم وضع الطلب في قائمة الانتظار بنجاح للتنزيل. }, خطأ -> { // حدث خطأ أثناء إدراج الطلب. }); } }
يعد تتبع تقدم التنزيل وحالته أمرًا سهلاً للغاية باستخدام ميزة الجلب. ما عليك سوى إضافة 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 تنزيل التنزيل) { } @Override public void onError(@NotNull Download download) { Error error = download.getError(); } @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload(download, etaInMilliSeconds); } intprogress = download.getProgress(); } @Override public void onPaused(@NotNull Download download) { } @Override public void onResumed(@NotNull تنزيل التنزيل) { } @Override public void onCancelled(@NotNull تنزيل التنزيل) { } @Override public void onRemoved(@NotNull تنزيل التنزيل) { } @Override public void onDeleted(@NotNull تنزيل التنزيل) { } };fetch.addListener(fetchListener);// قم بإزالة المستمع عند الانتهاء.fetch.removeListener(fetchListener);
يدعم الجلب إيقاف التنزيلات مؤقتًا واستئنافها باستخدام معرف الطلب. معرف الطلب هو معرف فريد يقوم بتعيين طلب لتنزيل الجلب. سيكون للتنزيل الذي يتم إرجاعه بواسطة Fetch معرف يطابق معرف الطلب الذي بدأ التنزيل.
طلب الطلب 1 = طلب جديد (url، ملف)؛ طلب الطلب 2 = طلب جديد (url2، file2)؛fetch.pause (request1.getId ())؛ ...fetch.resume(request2.getId());
يمكنك الاستعلام عن جلب للحصول على معلومات التنزيل بعدة طرق.
// الاستعلام عن جميع downloadsfetch.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) { // الوصول إلى التنزيلات التي يتم تنزيلها } });// يمكنك أيضًا الوصول إلى التنزيلات المجمعةint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List Extends Download> downloads) { / / الوصول إلى التنزيلات المجمعة } });
عند الانتهاء من استخدام مثيل الجلب، ما عليك سوى تحريره.
// افعل العمل. أغلق ()؛ // افعل المزيد من العمل
بشكل افتراضي، يستخدم Fetch عميل HttpUrlConnection عبر HttpUrlConnectionDownloader لتنزيل الطلبات. أضف تبعية Gradle التالية إلى build.gradle الخاص بتطبيقك لاستخدام OkHttp Downloader بدلاً من ذلك. يمكنك إنشاء برامج التنزيل المخصصة الخاصة بك إذا لزم الأمر. راجع مستندات Java للحصول على التفاصيل.
تنفيذ "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
استخدام اندرويد اكس:
تنفيذ "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
قم بتعيين OkHttp Downloader لاستخدامه في الجلب.
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(جديد OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
إذا كنت ترغب في الاستفادة من ميزات RxJava2 عند استخدام Fetch، أضف تبعية gradle التالية إلى ملف build.gradle الخاص بالتطبيق الخاص بك.
تنفيذ "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
استخدام اندرويد اكس:
تنفيذ "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 هو خادم ملفات TCP خفيف الوزن يعمل مثل خادم ملفات HTTP مصمم خصيصًا لمشاركة الملفات بين أجهزة Android. يمكنك استضافة موارد الملفات باستخدام FetchFileServer على جهاز واحد ويتعين عليك جلب ملفات التنزيل من الخادم على جهاز آخر. راجع نموذج التطبيق لمزيد من المعلومات. ستتم إضافة Wiki على FetchFileServer في الأيام القادمة.
ابدأ في استخدام FetchFileServer عن طريق إضافة تبعية gradle إلى ملف build.gradle الخاص بالتطبيق الخاص بك.
تنفيذ "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
استخدام اندرويد اكس:
تنفيذ "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
ابدأ تشغيل مثيل FetchFileServer وأضف ملفات الموارد التي يمكنه تقديمها للعملاء المتصلين.
public class TestActivity Extends AppCompatActivity { FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = FetchFileServer.Builder الجديد (هذا) .يبني()؛ 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); } }
يعد تنزيل ملف من FetchFileServer باستخدام Fetch أمرًا سهلاً.
الطبقة العامة TestActivity يمتد AppCompatActivity { جلب الجلب؛ @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = جديد 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") // اسم أو معرف مصدر الملف .يخلق()؛ طلب الطلب = طلب جديد(url, file); fetch.enqueue(request, request1 -> { // تم وضع الطلب في قائمة الانتظار للتنزيل }, خطأ -> { // حدث خطأ أثناء وضع التنزيل في قائمة الانتظار }); } @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("نشاط الاختبار"، "مكتمل"); } }; }
قم بترحيل التنزيلات من Fetch1 إلى Fetch2 باستخدام مساعد الترحيل. أضف تبعية gradle التالية إلى ملف build.gradle الخاص بالتطبيق الخاص بك.
تنفيذ "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
استخدام اندرويد اكس:
تنفيذ "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 TransferDownload :transferDownloads) { Log.d("newDownload",transferDownload.getNewDownload().toString() Log.d("oldId in Fetch v1",transferDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(true); // إعداد وتشغيل Fetch2 بعد الترحيل } Catch (SQLException e) { e.printStackTrace(); } } }).يبدأ()؛ } else { // إعداد وتشغيل Fetch2 بشكل طبيعي }
لا يمكن أن يتحسن الجلب إلا إذا قمت بتقديم مساهمات في التعليمات البرمجية. العثور على خطأ؟ أبلغ عنه. هل لديك فكرة مميزة تود رؤيتها في 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.