Belirli durumlarda özel bir ileti dizisi stratejisi sağlamanız gerekebilir. Örneğin,
geri çağırmaya dayalı, eşzamansız bir işlem gerçekleştirmeniz gerekebilir.
WorkManager, bu kullanım alanını
ListenableWorker.
ListenableWorker, en temel çalışan API'dir;
Worker,
CoroutineWorker ve
RxWorker bu sınıftan türetilir. CEVAP
ListenableWorker yalnızca işin başlaması ve bitmesi gerektiği zaman sinyal verir ve ekipten ayrılır
tamamen size bağlı. İşi başlatma sinyali ana ekranda çağrılır
Bu yüzden, şirketinizin en sık karşılaştığı sorunların arka plandaki ileti dizisine
seçim manuel olarak yapabilirsiniz.
Soyut yöntem
ListenableWorker.startWork()
ListenableFuture değerini döndürür
Result. CEVAP
ListenableFuture, basit bir arayüzdür: Future sağlar.
işleyicileri ekleme ve istisnaları yayma işlevleri sunar.
startWork yöntemi için bir ListenableFuture döndürmeniz beklenir. Bu durumda,
İşlem tamamlandığında işlemin Result ile ayarlanır. Proje bilgilerini
Aşağıdaki iki yöntemden biriyle ListenableFuture örneği:
- Guava kullanıyorsanız
ListeningExecutorServicekullanın. - Aksi halde
councurrent-futuresve gradle dosyanızaCallbackToFutureAdapter.
Bir işi eşzamansız geri çağırmaya dayalı bir şekilde yürütmek isterseniz, aşağıdaki gibi bir işlem yapın:
Kotlin
class CallbackWorker( context: Context, params: WorkerParameters ) : ListenableWorker(context, params) { override fun startWork(): ListenableFuture<Result> { return CallbackToFutureAdapter.getFuture { completer -> val callback = object : Callback { var successes = 0 override fun onFailure(call: Call, e: IOException) { completer.setException(e) } override fun onResponse(call: Call, response: Response) { successes++ if (successes == 100) { completer.set(Result.success()) } } } repeat(100) { downloadAsynchronously("https://example.com", callback) } callback } } }
Java
public class CallbackWorker extends ListenableWorker { public CallbackWorker(Context context, WorkerParameters params) { super(context, params); } @NonNull @Override public ListenableFuture<Result> startWork() { return CallbackToFutureAdapter.getFuture(completer -> { Callback callback = new Callback() { int successes = 0; @Override public void onFailure(Call call, IOException e) { completer.setException(e); } @Override public void onResponse(Call call, Response response) { successes++; if (successes == 100) { completer.set(Result.success()); } } }; for (int i = 0; i < 100; i++) { downloadAsynchronously("https://www.example.com", callback); } return callback; }); } }
İşinizle ilgili olarak
durduruldu?
Çalışma yapıldığında ListenableWorker adlı kullanıcının ListenableFuture cihazı her zaman iptal edilir
durması bekleniyor. CallbackToFutureAdapter kullanarak sadece bir
aşağıdaki adımları uygulayın:
Kotlin
class CallbackWorker( context: Context, params: WorkerParameters ) : ListenableWorker(context, params) { override fun startWork(): ListenableFuture<Result> { return CallbackToFutureAdapter.getFuture { completer -> val callback = object : Callback { var successes = 0 override fun onFailure(call: Call, e: IOException) { completer.setException(e) } override fun onResponse(call: Call, response: Response) { ++successes if (successes == 100) { completer.set(Result.success()) } } } completer.addCancellationListener(cancelDownloadsRunnable, executor) repeat(100) { downloadAsynchronously("https://example.com", callback) } callback } } }
Java
public class CallbackWorker extends ListenableWorker { public CallbackWorker(Context context, WorkerParameters params) { super(context, params); } @NonNull @Override public ListenableFuture<Result> startWork() { return CallbackToFutureAdapter.getFuture(completer -> { Callback callback = new Callback() { int successes = 0; @Override public void onFailure(Call call, IOException e) { completer.setException(e); } @Override public void onResponse(Call call, Response response) { ++successes; if (successes == 100) { completer.set(Result.success()); } } }; completer.addCancellationListener(cancelDownloadsRunnable, executor); for (int i = 0; i < 100; ++i) { downloadAsynchronously("https://www.example.com", callback); } return callback; }); } }
ListenableWorker'ı farklı bir işlemde çalıştırma
Ayrıca şunu kullanarak bir çalışanı belirli bir işleme bağlayabilirsiniz:
RemoteListenableWorker
ListenableWorker uygulanması.
RemoteListenableWorker, iki ek bağımsız değişkenle belirli bir işleme bağlanır
iş talebini oluştururken giriş verilerinin bir parçası olarak sağladığınız veriler:
ARGUMENT_CLASS_NAME ve ARGUMENT_PACKAGE_NAME.
Aşağıdaki örnekte, şuna bağlı bir iş isteği gösterilmektedir: özel işlem:
Kotlin
val PACKAGE_NAME = "com.example.background.multiprocess" val serviceName = RemoteWorkerService::class.java.name val componentName = ComponentName(PACKAGE_NAME, serviceName) val data: Data = Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName) .putString(ARGUMENT_CLASS_NAME, componentName.className) .build() return OneTimeWorkRequest.Builder(ExampleRemoteListenableWorker::class.java) .setInputData(data) .build()
Java
String PACKAGE_NAME = "com.example.background.multiprocess"; String serviceName = RemoteWorkerService.class.getName(); ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName); Data data = new Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName()) .putString(ARGUMENT_CLASS_NAME, componentName.getClassName()) .build(); return new OneTimeWorkRequest.Builder(ExampleRemoteListenableWorker.class) .setInputData(data) .build();
Her RemoteWorkerService için ayrıca
AndroidManifest.xml dosyanız:
<manifest ... > <service android:name="androidx.work.multiprocess.RemoteWorkerService" android:exported="false" android:process=":worker1" /> <service android:name=".RemoteWorkerService2" android:exported="false" android:process=":worker2" /> ... </manifest>