Προς το περιεχόμενο

Κόλλημα με treads σε Android APP + Codereview Request


PC_MAGAS

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Στην εφαρμογή μου https://github.com/pc-magas/sercommH300sVoipCredentialsRecovery που αναπτύσσω για να λαμβάνω τα voip settings του H300s έχω φρακάρει σε ένα stubborn σημείο. (Ps η εφαρμογή έχει πέρα την χρησιμότητα ΚΑΙ εκπαιδευτικο χαρακτήρα στο να έχω τεχνογνωσία περί Java Android APP).

Στην κλάση Η300sCredentialsRetriever https://github.com/pc-magas/sercommH300sVoipCredentialsRecovery/blob/master/app/src/main/java/com/example/vodafone_fu_h300s/logic/Η300sCredentialsRetriever.java έχω όλη την λογική λήψεως των VOIP Credentials (plz νιώστε ελέυθερα για codereview as well, ελεημοσύνη μου κάνετε)

Ο χρήστης αξιοποιεί το ακόλουθο Activity ώστε να δίνει τα στοιχεία που χρειάζονται για να γίνει Login και να ληφθούν τα στοιχεία:
https://github.com/pc-magas/sercommH300sVoipCredentialsRecovery/blob/master/app/src/main/java/com/example/vodafone_fu_h300s/screens/ConnectIntoRouterActivity.java

To πρόβλημα είναι ότι η εφαρμογή μου αδυνατεί να κάνει δικτυακές συνδέσεις από το ίδιο Τhread του activity.

Έτσι κάνω ένα thread και εκτελώ όλο το logic εκεί. Προς το παρόν δοκίμασα τις κάτωθι προσεγγίσεις:

  1. να αξιοποιήσω handler (Current Head στο Master branch) αλλά η retrieveUrlContents https://github.com/pc-magas/sercommH300sVoipCredentialsRecovery/blob/9d868391645ae8f8037dbf0c84a0961b749e8f78/app/src/main/java/com/example/vodafone_fu_h300s/logic/Η300sCredentialsRetriever.java#L118 πετά το Exception android.os.NetworkOnMainThreadException
  2. Να αξιοποιήσω την  runOnUiThread αλλά όπως και το παρπάνω approach λαμβάνω NetworkOnMainThreadException..
  3. Να αξιοποιήσω αυτήν την προσέγγιση https://stackoverflow.com/q/67150195/4706711
  4. Να αξιοποιήσω απ' ευθείας Thread που αλλά με εμποδίζει μέσω των lambda να αννανεώνω το υπάρχων Activity, λαμβάνω το ίδιο ακριβώς σφάλμα.

Κάποια άλλη ιδέα αυτό προβλέπω να με παιδεύει καιρό. Έχετε ιδέα για διαφορετικό approach;

Τέλος, ένα codereview εφόσον το θέλετε είναι ευπροσδεκτο.

Επεξ/σία από PC_MAGAS
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με μια γρηγορη ματια προσπαθεις να βαλεις networking μεσα στο main thread κατι το οποιο ειναι αδυνατο γενικα γιαυτο και σκαει το exception.

Χρησιμοποιησε AsyncTask για το networking σου και θα κανεις τις ανανεωσεις που θελεις στην onPostExecute.

Δλδ η retrieveUrlContents θα κανει execute ενα AsyncTask το οποιο θα ειναι πχ το Η300sCredentialsRetriever το οποιο στην onPostExecute θα σ κανει update με βαση το response π θα ερθει.

Μια χαρα τα εχεις χωρισμενα οποτε νομιζω ειναι σχετικα απλή η αλλαγή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το AsyncTask όμως ξέρω σαν API είναι deprecated. Πάλι επειδή σκοπεύω στο άμεσο μέλλον να το σπάσω σε APP και Library για να κάνω και ένα CLI εργαλείο ότι Async λέω να γίνετε στο Activity.

Τελικά, δοκίμασα ένα διαφορετικό Approach:
https://github.com/pc-magas/sercommH300sVoipCredentialsRecovery/blob/39de2ca58252ee48f68017208f364caf0ffe6c6c/app/src/main/java/com/example/vodafone_fu_h300s/screens/ConnectIntoRouterActivity.java#L67-L75

Με την χρήση ενός handler και έπαιξε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε java αν θες blocking network requests θα το κάνεις με thread pool και completable future. Γενικά απαγορεύεται να κάνεις network calls στο main thread και υπάρχουν βιβλιοθήκες όπως το retrofit για να σου κάνουν την ζωή πιο εύκολη με τέτοια θέματα. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...