runonuithread()なしで使用してasynctaskを作成/実行する方法
-
27-09-2019 - |
質問
私は持っています Service
それが作成されます AsyncTask
ファイルをダウンロードするためのs。アクティビティでは、作成します Runnable
sまたは 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がどのように見えるかを知りません)。
所属していません StackOverflow