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
ListeningExecutorService
kullanın. - Aksi halde
councurrent-futures
ve 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>