{"id":623,"date":"2021-07-14T10:25:54","date_gmt":"2021-07-14T04:55:54","guid":{"rendered":"https:\/\/askadmin.com\/?p=623"},"modified":"2021-07-18T17:16:19","modified_gmt":"2021-07-18T11:46:19","slug":"android-dynamic-wallpaper-without-any-library","status":"publish","type":"post","link":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/","title":{"rendered":"Consider using a handler in place of CountDownTimer for UI tasks"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>In any programming language a same goal can be achieved through many ways . I am going to discuss how to replace a <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/CountDownTimer\">countdown timer<\/a> with <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/Handler\">handler<\/a> for changing images dynamically on android .<\/p>\n<p><strong>What I needed was the following :<\/strong><\/p>\n<ol>\n<li>I have\u00a0 android assets folder with several images and I want to load\u00a0 every time a different image from this\u00a0 to\u00a0 one of my ImageViews of application .<\/li>\n<li>I do not want to use any library and maintain it.<\/li>\n<li>User can choose time interval to change wallpaper.<\/li>\n<li>Clicking on image slideshow should close the activity<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Using a countdown timer we can load\u00a0 random images\u00a0 into a ImageView for indefinite period of time . I was using countdown timer something like below for the same .<\/p>\n<p>In OnCreate method<\/p>\n<p><em><strong>\/\/set full screen\u00a0 wallpaper\u00a0 \u00a0and hide including nav bar and status bar<\/strong><\/em><\/p>\n<pre><em><strong>requestWindowFeature(Window.FEATURE_NO_TITLE);\r\ngetWindow().getDecorView().setSystemUiVisibility(\r\n View.SYSTEM_UI_FLAG_LAYOUT_STABLE\r\n         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\r\n         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\r\n         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\r\n         | View.SYSTEM_UI_FLAG_FULLSCREEN\r\n         | View.SYSTEM_UI_FLAG_IMMERSIVE);\r\n\r\n\r\n setContentView(R.layout.activity_wallpaper);<\/strong><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><em><strong>\/\/get images from assets sub directory &#8220;visuals&#8221;\u00a0 and adding to a array list<\/strong><\/em><\/p>\n<pre><em><strong>AssetManager assetManager = getAssets();\r\n\r\n\r\ntry {\r\n    String[] imgPath = assetManager.list(\"visuals\");\r\n    mlist  = new ArrayList&lt;&gt;();\r\n\r\n    for (int i = 0; i&lt; imgPath.length; i++) {\r\n     mlist.add(imgPath[i]); \r\n  \r\n}\r\n\r\n<\/strong>\r\n<strong>\r\nimageSlider = (ImageView) findViewById(R.id.imageslider);\r\nchangeimage(imageslider);\r\n<\/strong><\/em><span>\r\n<\/span><span>\r\n<em><strong>\/\/Close the wallpaper activity if user clicks on imageview\r\n<\/strong><\/em><\/span><em><strong>imageSlider.setOnClickListener(new View.OnClickListener() {\r\n\r\n    public void onClick(View v) {\r\n\/\/clicking on wallpaper image should close the activity\r\n       finish();\r\n    }\r\n});\r\n<\/strong><\/em><span>\r\n<\/span><span>\r\n<\/span><span>\r\n<\/span><em><strong>\/\/getting duration from preferences\r\n\/\/default time interval is 3 seconds \r\n\/\/user is allowed to set more than 3 seconds.\r\n              time = 3000;\r\n MyPrefManager pref = new MyPrefManager(getApplicationContext()); \r\n\r\n            if ((int) TimeUnit.SECONDS.toMillis(pref.getWallpaperTimer()) &gt; 0){\r\n\r\n                 time = (int) TimeUnit.SECONDS.toMillis(pref.getWallpaperTimer());\r\n\r\n\r\n            }\r\n<\/strong><\/em>\r\n<\/pre>\n<p>Now this is the time to choose wether to use countdown timer or handler.<\/p>\n<p>I was using countdown timer with this following method .<\/p>\n<p><code><em><strong>ct = new CountDownTimer(time,1000) <\/strong><\/em><\/code><br \/>\n<code><em><strong>{ <\/strong><\/em><\/code><br \/>\n<code><em><strong>int i=0;<\/strong><\/em><\/code><br \/>\n<code><em><strong>@Override <\/strong><\/em><\/code><br \/>\n<code><em><strong>public void onTick(long millisUntilFinished) {}<\/strong><\/em><\/code><br \/>\n<code><em><strong>@Override public void onFinish() { <\/strong><\/em><\/code><br \/>\n<code><em><strong>changeimage(imageslider);<\/strong><\/em><\/code><br \/>\n<code><em><strong>i++;<\/strong><\/em><\/code><br \/>\n<code><em><strong>if(i== mlist.size()-1) i=0; start(); }<\/strong><\/em><\/code><br \/>\n<code><em><strong>}.start();<\/strong><\/em><\/code><\/p>\n<p>&nbsp;<\/p>\n<p><code><em><strong>\/\/Always cancle the timer when activity stops.\u00a0<\/strong><\/em><\/code><\/p>\n<pre><em><strong>\u00a0 \u00a0@Override\r\n public void onStop() {\r\nsuper.onStop();\r\nif (ct!=null) {\r\nct.cancel();\r\n ct = null;\r\n }\r\n}\r\n<\/strong><\/em><\/pre>\n<pre> Above countdown timer creates a new thread . So for changing a images ( UI related) we do not want \r\nto use a new thread instead , we use handler which runs on main thread.\r\nYou can replace countdowntimer with handler like below.\r\n\r\n<em><strong> h = new Handler();\r\n    r = new Runnable() {\r\n        @Override\r\n        public void run() {\r\n\r\n            changeimage(imageslider);\r\n            h.postDelayed(this, time);\r\n        }\r\n    };\r\n    h.post(r);\r\n<\/strong><\/em><span>    \r\n<\/span><span>\r\n<\/span><em><strong>} catch (IOException e) {\r\n    Log.e(\"sreekanth\", e.getMessage());\r\n}<\/strong><\/em><\/pre>\n<p><code><em><strong>@Override <\/strong><\/em><\/code><\/p>\n<p><code><em><strong> public void onStop() {<\/strong><\/em><\/code><\/p>\n<p><code><em><strong> super.onStop();<\/strong><\/em><\/code><\/p>\n<p><code><em><strong> h.removeCallbacks(r);<\/strong><\/em><\/code><\/p>\n<p><code><em><strong> } <\/strong><\/em><\/code><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre><em><strong>\r\n\r\n<\/strong><\/em>I am using glide to load images . By default Glide uses  RGB_565 (16 bit depth)\r\nwhich may reduce image quality . To load original image with glide, I ma using PREFER_ARGB_8888 option.\r\nAlso note that I shuffle the image array list to get a real random image every time.<\/pre>\n<pre><em><strong>private void changeImage(ImageView iv) {\r\n\r\n\/\/shuffle the list to get random image\r\n   Collections.shuffle(mlist);\r\n<\/strong><\/em><span>\r\n<\/span><em><strong>    final Context context = getApplication().getApplicationContext();\r\n\r\n    if (isValidContext(context)) {\r\n        Glide.with(getApplicationContext())\r\n                .load(Uri.parse(\"file:\/\/\/android_asset\/visuals\/\" + mlist.get(0)))\r\n                \/\/keep glide image quality best\r\n                .format(DecodeFormat.PREFER_ARGB_8888)\r\n                .override(Target.SIZE_ORIGINAL)\r\n                .into(iv);\r\n\r\n\r\n\r\n    }\r\n\r\n<\/strong><\/em><em><strong>public static boolean isValidContext(final Context context) {\r\n    if (context == null) {\r\n        return false;\r\n    }\r\n    if (context instanceof Activity) {\r\n        final Activity activity = (Activity) context;\r\n        if (activity.isDestroyed() || activity.isFinishing()) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}<\/strong><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; In any programming language a same goal can be achieved through many ways . I am going to discuss how to replace a countdown timer with handler for changing images dynamically on android . What I needed was the following : I have\u00a0 android assets folder with several images [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[142,1],"tags":[200,198,199,203,201,202],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner<\/title>\n<meta name=\"description\" content=\"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner\" \/>\n<meta property=\"og:description\" content=\"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/\" \/>\n<meta property=\"og:site_name\" content=\"Ask Admin - A Lifelong Learner\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-14T04:55:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-18T11:46:19+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"balu sreekanth\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/askadmin.com\/aa\/#website\",\"url\":\"https:\/\/askadmin.com\/aa\/\",\"name\":\"Ask Admin - A Lifelong Learner\",\"description\":\"Mobile App Development | IP Telephony | Linux\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/askadmin.com\/aa\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#webpage\",\"url\":\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/\",\"name\":\"Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner\",\"isPartOf\":{\"@id\":\"https:\/\/askadmin.com\/aa\/#website\"},\"datePublished\":\"2021-07-14T04:55:54+00:00\",\"dateModified\":\"2021-07-18T11:46:19+00:00\",\"author\":{\"@id\":\"https:\/\/askadmin.com\/aa\/#\/schema\/person\/e1ff95d4a91ea001e25af3273533a345\"},\"description\":\"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.\",\"breadcrumb\":{\"@id\":\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/askadmin.com\/aa\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Consider using a handler in place of CountDownTimer for UI tasks\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/askadmin.com\/aa\/#\/schema\/person\/e1ff95d4a91ea001e25af3273533a345\",\"name\":\"balu sreekanth\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/askadmin.com\/aa\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6aebf95935573dc70f536f1003a2fb8c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6aebf95935573dc70f536f1003a2fb8c?s=96&d=mm&r=g\",\"caption\":\"balu sreekanth\"},\"sameAs\":[\"http:\/\/askadmin.com\"],\"url\":\"https:\/\/askadmin.com\/aa\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner","description":"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/","og_locale":"en_US","og_type":"article","og_title":"Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner","og_description":"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.","og_url":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/","og_site_name":"Ask Admin - A Lifelong Learner","article_published_time":"2021-07-14T04:55:54+00:00","article_modified_time":"2021-07-18T11:46:19+00:00","twitter_misc":{"Written by":"balu sreekanth","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/askadmin.com\/aa\/#website","url":"https:\/\/askadmin.com\/aa\/","name":"Ask Admin - A Lifelong Learner","description":"Mobile App Development | IP Telephony | Linux","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/askadmin.com\/aa\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#webpage","url":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/","name":"Consider using a handler in place of CountDownTimer for UI tasks - Ask Admin - A Lifelong Learner","isPartOf":{"@id":"https:\/\/askadmin.com\/aa\/#website"},"datePublished":"2021-07-14T04:55:54+00:00","dateModified":"2021-07-18T11:46:19+00:00","author":{"@id":"https:\/\/askadmin.com\/aa\/#\/schema\/person\/e1ff95d4a91ea001e25af3273533a345"},"description":"Replace countdown timer with handler for UI updates on android. Set images dynamically . Set random Images for wallpaper slideshow without using any library.","breadcrumb":{"@id":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/askadmin.com\/aa\/android-dynamic-wallpaper-without-any-library\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/askadmin.com\/aa\/"},{"@type":"ListItem","position":2,"name":"Consider using a handler in place of CountDownTimer for UI tasks"}]},{"@type":"Person","@id":"https:\/\/askadmin.com\/aa\/#\/schema\/person\/e1ff95d4a91ea001e25af3273533a345","name":"balu sreekanth","image":{"@type":"ImageObject","@id":"https:\/\/askadmin.com\/aa\/#personlogo","inLanguage":"en-US","url":"https:\/\/secure.gravatar.com\/avatar\/6aebf95935573dc70f536f1003a2fb8c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6aebf95935573dc70f536f1003a2fb8c?s=96&d=mm&r=g","caption":"balu sreekanth"},"sameAs":["http:\/\/askadmin.com"],"url":"https:\/\/askadmin.com\/aa\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/posts\/623"}],"collection":[{"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/comments?post=623"}],"version-history":[{"count":14,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/posts\/623\/revisions"}],"predecessor-version":[{"id":629,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/posts\/623\/revisions\/629"}],"wp:attachment":[{"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/media?parent=623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/categories?post=623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/askadmin.com\/aa\/wp-json\/wp\/v2\/tags?post=623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}