3

ファイルをダウンロードするためのServiceを作成する があります。AsyncTaskアクティビティでは、に渡すRunnableやを作成します。サービスからそのメソッドにアクセスできないので、正しく使用するにはどうすればよいですか(UI スレッドをブロックせずに重い作業を行う)。ThreadActivity.runOnUiThread()AsyncTask

4

1 に答える 1

2

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

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を更新する方法についてのあなたの本当の質問について。このメソッドはProgressListenerインスタンスを受け取ることに注意してください。次のようになります。

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

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

于 2010-10-05T17:52:31.937 に答える