كيفية إنشاء/تشغيل Asynctask في الخدمة دون RunonuithRead ()
-
27-09-2019 - |
سؤال
انا املك Service
هذا يخلق AsyncTask
S لتنزيل الملفات. في الأنشطة ، نخلق Runnable
S أو Thread
ق أن نمر إليه Activity.runOnUiThread()
. لا يمكنني الوصول إلى هذه الطريقة من الخدمة ، فكيف أستخدم AsyncTask
بشكل صحيح ، (هل العمل الثقيل دون منع موضوع واجهة المستخدم)؟
المحلول
إذا تم استدعاء خدمتك فقط من التطبيق الخاص بك ، ويمكنك جعلها مفردة ، ثم جرب هذا:
public class FileDownloaderService extends Service implements FileDownloader {
private static FileDownloaderService instance;
public FileDownloaderService () {
if (instance != null) {
throw new IllegalStateException("This service is supposed to be a singleton");
}
}
public static FileDownloaderService getInstance() {
// TODO: Make sure instance is not null!
return instance;
}
@Override
public void onCreate() {
instance = this;
}
@Override
public IBinder onBind(@SuppressWarnings("unused") Intent intent) {
return null;
}
@Override
public void downloadFile(URL from, File to, ProgressListener progressListener) {
new Thread(new Runnable() {
@Override
public void run() {
// Perform the file download
}
}).start();
}
}
الآن يمكنك الاتصال مباشرة على أساليب خدمتك. لذلك فقط اتصل downloadFile()
لوضع الخدمة للعمل.
عنك حقا مسألة كيفية تحديث واجهة المستخدم. لاحظ أن هذه الطريقة تتلقى ملف ProgressListener
نموذج. يمكن أن يبدو هكذا:
public interface ProgressListener {
void startDownloading();
void downloadProgress(int progress);
void endOfDownload();
void downloadFailed();
}
الآن يمكنك فقط تحديث واجهة المستخدم من النشاط (وليس من الخدمة ، والتي لا تزال غير مدركة لكيفية ظهور واجهة المستخدم).
لا تنتمي إلى StackOverflow