2
votes

La méthode doWork () de la classe Workmanager Worker n'est pas appelée

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()
    }
}


8 commentaires

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


3 Réponses :


1
votes

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 .


1 commentaires

Merci très utile



1
votes

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)


0 commentaires