質問

私は持っています Service それが作成されます AsyncTaskファイルをダウンロードするためのs。アクティビティでは、作成します Runnablesまたは Thread私たちが通過するs Activity.runOnUiThread(). 。サービスからその方法にアクセスできないので、どのように使用できますか AsyncTask 正しく、(UIスレッドをブロックせずに重い作業をします)?

役に立ちましたか?

解決

サービスがアプリケーションからのみ呼び出され、シングルトンにすることができる場合は、これを試してみてください。

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() サービスを機能させるために。

あなたの〜について 本物 UIを更新する方法の質問。この方法がaを受信することに注意してください ProgressListener 実例。このように見えるかもしれません:

public interface ProgressListener {
    void startDownloading();
    void downloadProgress(int progress);
    void endOfDownload();
    void downloadFailed();
}

これで、アクティビティからUIを更新するだけです(サービスからではなく、UIがどのように見えるかを知りません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top