سؤال

انا املك Service هذا يخلق AsyncTaskS لتنزيل الملفات. في الأنشطة ، نخلق RunnableS أو 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();
}

الآن يمكنك فقط تحديث واجهة المستخدم من النشاط (وليس من الخدمة ، والتي لا تزال غير مدركة لكيفية ظهور واجهة المستخدم).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top