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