ListenableWorker'da mesaj dizisi oluşturma

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:

  1. Guava kullanıyorsanız ListeningExecutorService kullanın.
  2. Aksi halde councurrent-futures ve gradle dosyanıza CallbackToFutureAdapter.

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>

Örnekler