doWork ()
méthode de la classe worker jamais appelée sous Android
Je souhaite synchroniser les données hors ligne avec le serveur lorsque la connexion Internet sera connectée
// Classe Worker Manager
class WorkMnagerActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_work_mnager) val button = findViewById<Button>(R.id.button2) button.setOnClickListener { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() val data = Data.Builder() .putString("tittle", "") .build() val oneTimeWorkRequest = OneTimeWorkRequest.Builder(UploadWorker::class.java) .setInputData(data) .setConstraints(constraints) .build() WorkManager.getInstance().enqueue(oneTimeWorkRequest); WorkManager.getInstance().getWorkInfoByIdLiveData(oneTimeWorkRequest.id) .observe(this, Observer { it?.let { if (it.state == WorkInfo.State.ENQUEUED) { // Show the work state in text view Log.e("ddd","Download enqueued.") } else if (it.state == WorkInfo.State.BLOCKED) { Log.e("ddd","Download blocked") } else { Log.e("ddd","Download running.") } } }) } } }
// Voir la classe
class UploadWorker (context: Context, workerParameters: WorkerParameters, val authRepository: AuthRepository): Worker(context,workerParameters) { override fun doWork(): Result { Log.e("inDo", "work") GlobalScope.launch { val resource = authRepository.loginAsync("wmwdwnd@gmail.com", "sdnwnd").await() when (resource) { is Resource.Success -> { Result.success() Log.e("complete", "ass") } is Resource.Error -> { Result.success() Log.e("error", "asdd") //when (resource.code) {} } else -> { Result.success() } } } return Result.success() } }
3 Réponses :
Une classe worker
ne prend en charge que les tâches synchrones (WorkManager se charge de lancer doWork ()
sur un exécuteur en arrière-plan. De Threading dans Worker :
Notez que Worker.doWork () est un appel synchrone - vous devez effectuer l'intégralité de votre travail d'arrière-plan de manière bloquante et le terminer au moment où la méthode se termine.
Si vous avez besoin d'exécuter quelque chose de manière asynchrone, je vous suggère d'utiliser ou un CoroutineWorker
ou un ListenableWorker
.
Vous pouvez trouver plus d'informations sur le guide Threading dans WorkManager a>.
Merci très utile
Vérifiez si vous êtes connecté au réseau, puisque vous avez ajouté une contrainte
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork: NetworkInfo? = cm.activeNetworkInfo val isConnected: Boolean = activeNetwork?.isConnected == true
Essayez également de vérifier le réseau, vous pouvez le vérifier en utilisant
.setRequiredNetworkType(NetworkType.CONNECTED)
Les classes
Workers
ne doivent avoir que deux paramètres dans le constructeur
context: Context
et workerParameters: WorkerParameters
class UploadWorker (context: Context, workerParameters: WorkerParameters) {..}
Dans votre cas, il y en a un autre val authRepository: AuthRepository code > qui casse votre code.
Pour transmettre des dépendances supplémentaires à votre
Worker
, vous pouvez utiliser WorkerFactory
, décrit en détails ici
est-ce que le journal
Log.e ("inDo", "work")
est imprimé@ManojPerumarath monsieur rien n'est imprimé dans Log.e (), même le débogueur ne fonctionne pas non plus
Essayez de supprimer le paramètre
val authRepository: AuthRepository
du constructeur.@ J.D.1731 oui ça va dans la méthode doWork mais je veux poster les données sur le serveur dans cette méthode. J'utilise le modèle MVVM j'ai besoin de la classe authRespository pour implémenter les services Web
Utilisez toute autre méthode pour fournir la dépendance, le constructeur doit être sans paramètres supplémentaires. Si vous utilisez des bibliothèques DI, vous finirez malheureusement par fournir Factory pour votre Worker, réf: android.jlelse.eu/...
@ J.D.1731 merci de me guider. J'ai utilisé l'interface KoiComponent pour appeler Api dans do Work Class
Par curiosité, cela a-t-il commencé à bien fonctionner?
@ J.D.1731 oui ça marche bien