Salut tout le monde ! Dernièrement, histoire de prendre en main kotlin, je me suis lancé dans une petite application qui avait pour but de recenser les conférences parlant de la programmation histoire d'avoir un truc sous la main pour faire un peu de veille technologique.
Au final, l'application a pris un peu plus d'ampleur que prévu, que ce soit au niveau du contenu mais également du côté apprentissage car en plus de m'essayer à kotlin, j'ai également décidé de tester les librairies "architecture components" : https://developer.android.com/topic/libraries/architecture/index.html et surtout d'utiliser plus intensément RxJava. Pour infos, côté backend j'utilise Laravel.
Du coup l'application comporte maintenant en plus des conférences, des articles, des tutos et des bouquins.
Passer par un moteur de recherche pour avoir accès au savoir, c'est trop long et on s'y perd souvent.
Je pense avoir plaisir à l'ouvrir régulièrement! J'aime particulièrement le medium "livre" qui à mon sens permet de vraiment progresser dans le domaine qui nous plait.
La vidéo est un bon moyen de rester alerte et curieux en terme de développement. Le point fort est la variété des mots clefs. Souvent Youtube propre une ribambelle de vidéos en rapport avec celle que l'on regarde en terme de mots clef, c'est pas mal mais cela confine.
Il devrait y avoir pas mal d'amélioration au fil du temps car elle est encore assez "brute" et vu que c'était pour tester le langage kotlin, j'espère que j'aurais pas trop de crash dans un premier temps :D.
Bien joué pour ton application ! Peux-tu nous faire un mini retour sur les points forts et les points faibles, pour toi, de kotlin par rapport au java ? Nous donner ton ressenti ?
Alors, je suis allé lire le retour de Roland et j'ai pas grand chose à ajouter :D. Le seul truc qui est sûr, c'est que c'est dur de repasser à java ensuite ;).
Après un truc que j'ai remarqué mais j'sais pas si Roland l'a remarqué c'est que j'ai eu l'impression que les temps de build étaient plus long.
Mais ayant codé ça sous android studio 3 avec les nouveaux outils de profiling et la désactivation de l'instant run, c'est peut-être qu'une impression
Je n'ai pas spécialement remarqué pour les temps de build. Après plusieurs choses peuvent l'expliquer comme l'utilisation de Room qui fait de la génération de classe. Les annotations processeurs - il me semble - ne sont pas compatibles avec les builds incrémentales de gradle ce qui fait que tu recompiles tout ton projet à chaque fois.
Il faudrait cependant vérifier mes dires car j'ignore si c'est tjrs le cas pour gradle 4.
Je suis pas arrivé a trouver l'info pour gradle 4 mais en effet ça m'étonnerait pas que ça vienne de là. Sans parler également du fait que j'ai utilisé Dagger 2 également.
Après, faut aussi dire que mon ordinateur n'est plus de toute première jeunesse et après quelques heures ça se sent :D.
Très sympa comme application, j'ai cependant des retours à faire
Au niveau de la liste des "ressources", concernant le FAB, tu devrais peut être le faire disparaitre au scroll down et le faire apparaitre de nouveau au scroll up. Ca t'évite de rajouter un padding bottom à ta recyclerView pour laisser assez de place au FAB sans gêner quoi que ce soit.
Y-a-t-il besoin de forcer le landscape pour la lecture des vidéos ? Tu peux rajouter les mêmes informations que sur l'item de ta recycler en dessous de celle-ci en mode portrait, non ?
Pouvoir accéder à la liste des resources par catégorie serait pas mal (lors d'un click sur le label par exemple).
Question design, pour mettre en favoris on a un coeur mais dans le menu c'est une étoile, une raison particulière ? C'est dommage que ce ne soit pas uniformiser (après je ne suis pas designer, il y a peut être une réelle raison de faire comme ça )
En tout cas elle est très chouette, assez fluide Bravo !
PS : Je viens d'avoir un crash sur l'écran de vidéo en faisant le monkey :p
09-27 21:56:17.179 17897-17897/? E/ActivityThread: Activity justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@c5c8fc that was originally bound here
android.app.ServiceConnectionLeaked: Activity justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@c5c8fc that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1514)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1406)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1589)
at android.app.ContextImpl.bindService(ContextImpl.java:1541)
at android.content.ContextWrapper.bindService(ContextWrapper.java:678)
at com.google.android.youtube.player.internal.r.e(Unknown Source:72)
at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source:67)
at com.google.android.youtube.player.YouTubePlayerSupportFragment.a(Unknown Source:29)
at com.google.android.youtube.player.YouTubePlayerSupportFragment.onCreateView(Unknown Source:15)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
at android.support.v4.app.FragmentManagerImpl.ensureInflatedFragmentView(FragmentManager.java:1645)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1390)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1640)
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3702)
at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:338)
at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:39)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:67)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at justme.application.com.newconfapp.base.BaseVideoActivity.onCreate(BaseVideoActivity.kt:34)
at justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity.onCreate(SingleTutoActivity.kt:36)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4754)
at android.app.ActivityThread.-wrap18(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1599)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
09-27 21:56:17.445 17897-17897/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: justme.application.com.newconfapp, PID: 17897
kotlin.TypeCastException: null cannot be cast to non-null type com.google.android.youtube.player.YouTubePlayer.OnFullscreenListener
at justme.application.com.newconfapp.ui.main.VideoFragment.onInitializationSuccess(VideoFragment.kt:71)
at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source:70)
at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source:12)
at com.google.android.youtube.player.internal.r.g(Unknown Source:70)
at com.google.android.youtube.player.internal.r$c.a(Unknown Source:66)
at com.google.android.youtube.player.internal.r$b.a(Unknown Source:4)
at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source:95)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
09-27 21:56:17.466 22921-5671/? E/YouTubeAndroidPlayerAPI: Failed to construct CronetEngine
java.lang.IllegalStateException: Disk cache storage path already in use
at org.chromium.net.impl.CronetUrlRequestContext.<init>(SourceFile:28)
at ajba.a(SourceFile:9)
at aiwd.a(SourceFile:8)
at rap.a(SourceFile:36)
at rar.get(SourceFile:14)
at aijj.get(SourceFile:10)
at iqm.N(SourceFile:178)
at qqa.get(SourceFile:6)
at aijj.get(SourceFile:10)
at ray.a(SourceFile:91)
at xdo.b(SourceFile:19)
at xdd.a(SourceFile:18)
at xdc.a(SourceFile:15)
at xdk.a(SourceFile:41)
at xdy.a(SourceFile:19)
at xdd.b(SourceFile:24)
at xdd.a(SourceFile:18)
at xcx.run(SourceFile:4)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at qsw.run(SourceFile:24)
at java.lang.Thread.run(Thread.java:764)
Pour le FAB, j'ai testé ça ( version en cours de déploiement ) mais par contre dans la version actuelle il me faut toujours le padding car je détecte le scroll up / down mais pas la fin du recycler view :D. Mais j'aime bien l'effet donc j'ai laissé comme ça pour le moment ;).
Alors pour la vidéo en mode Landscape c'est plus un problème avec la librairie youtube ( en espérant qu'elle soit un jour mise à jour notamment en utilisant l'exoplayer ... ). Y'a pas mal de soucis avec, notamment lors d'une rotation lorsqu'une pub est en cours. Cela entraînait souvent des erreurs et les forums google sont souvent restés sans réponses... Du coup, j'ai choisi cette solution en attendant d'en trouver une meilleure ( les samples fournis avec la librairie bug aussi pour info ).
Ceci dit, pour le crash, ça devrait être bon. Si cependant t'arrivais à reproduire l'erreur sur la version 0.3, j'veux bien que tu me dises ce que t'as fait exactement
Pour l'icone des favoris dans le menu c'est une inattention de ma part et c'est corrigé :D.
Quand tu dis : "Pouvoir accéder à la liste des resources par catégorie serait pas mal (lors d'un click sur le label par exemple)."
Tu parles en cliquant sur un label directement dans une "CardView" ?
Autrement niveau design, c'est également pas mon point fort du tout :/. L'application reste assez générique de ce point de vue là. C'est le défaut d'avoir fait ça tout seul :D.
Sinon pour terminer, j'ai rajouté un fadeIn pour le chargement des images car j'avais pas fait gaffe que ce comportement avait été supprimé par défaut pour Glide 4.
J'ai publié la nouvelle version donc elle devrait être bientôt dispo
Quelqu'un saurait comment me dire pourquoi cette erreur arrive: Failed to construct CronetEngine or Disk cache storage path already in use using YouTubeAndroidPlayerAPI
E/MyFragment: onInitializationSuccess: https://www.youtube.com/watch?v=_7T7XnkJP3M
E/YouTubeAndroidPlayerAPI: Failed to construct CronetEngine. Using fallback Java implementation.
java.lang.IllegalStateException: Disk cache storage path already in use
at org.chromium.net.impl.CronetUrlRequestContext.<init>(SourceFile:28)
at alph.a(SourceFile:9)
at alko.a(SourceFile:8)
at sdv.a(SourceFile:36)
at sdx.get(SourceFile:14)
at akxn.get(SourceFile:10)
at jim.M(SourceFile:174)
at jfs.get(SourceFile:6)
at akxn.get(SourceFile:10)
at seq.d(SourceFile:98)
at seq.run(SourceFile:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at rvu.run(SourceFile:24)
at java.lang.Thread.run(Thread.java:818)
E/YouTubeAndroidPlayerAPI: Unhandled ErrorReason in onError
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.
Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre. Si vous avez une question similaire, créez plutôt votre propre sujet en détaillant votre contexte
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script