Make your Xamarin.Android app Responsive
Something i saw in novices mobile developers are that all the instructions they made they put it on the main thread so when you make that in a long hard work their apps goes down.
In C# there are two ways to do this
1. Threads (Parallels)
ParallelButton.Click += (sender, e) => { showHUD = ckbHUD.Checked; Task.Factory.StartNew(()=>{ if(showHUD) AndHUD.Shared.Show(this, "Downloading Image via Parallel", -1, MaskType.Clear); var httpClient = new HttpClient(); byte[] imageBytes = httpClient.GetByteArrayAsync("http://upload.wikimedia.org/wikipedia/commons/6/66/Big_size_chess_6759_CRI_08_2009_Langosta_Beach.jpg").Result; return imageBytes; }).ContinueWith(res=>{ string documents = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); string localPath = System.IO.Path.Combine (documents, "image.png"); File.WriteAllBytes (localPath, res.Result); var localImage = new Java.IO.File (localPath); if (localImage.Exists ()) { var imgBitmap = BitmapFactory.DecodeFile (localImage.AbsolutePath); RunOnUiThread(()=>{ LabelSize.Text = string.Format("Size: {0} MB", ConvertBytesToMegabytes(res.Result.Length)); ImageDonwloaded.SetImageBitmap (imgBitmap); }); } if(showHUD) AndHUD.Shared.Dismiss(this); }); };
2. Async/Await method
AsyncButton.Click += async (sender, e) => { showHUD = ckbHUD.Checked; if(showHUD) AndHUD.Shared.Show(this, "Downloading Image via Async/Await", -1, MaskType.Clear); var httpClient = new HttpClient(); byte[] imageBytes = await httpClient.GetByteArrayAsync("http://upload.wikimedia.org/wikipedia/commons/6/66/Big_size_chess_6759_CRI_08_2009_Langosta_Beach.jpg"); string documents = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); string localPath = System.IO.Path.Combine (documents, "image.png"); File.WriteAllBytes (localPath, imageBytes); var localImage = new Java.IO.File (localPath); if (localImage.Exists ()) { var imgBitmap = BitmapFactory.DecodeFile (localImage.AbsolutePath); LabelSize.Text = string.Format("Size: {0} MB", ConvertBytesToMegabytes(imageBytes.Length)); ImageDonwloaded.SetImageBitmap (imgBitmap); } if(showHUD) AndHUD.Shared.Dismiss(this); };
If you see in the example we download a picture and then we save it to the app folder and after this we put the image into a imageview.
Note: when you use task a task(parallel) if your expect to affect and ui element you need to implement the RunOnUiThread(()=>{});
Full Exmple at Github: https://github.com/AlejandroRuiz/Mono/tree/master/Responsive
remember if you have a question feel free to ask me, Happy Code #CSHARPLOVERS
Hi Author just now i found your blog its really awesome. Keep this work. It will more helpful for xamarin app developers.
ResponderEliminarHire affordable Xamarin Developer