Quantcast
Channel: Android.OS.NetworkOnMainThreadException: in async/await block - Stack Overflow
Viewing all articles
Browse latest Browse all 2

Android.OS.NetworkOnMainThreadException: in async/await block

$
0
0

I am trying to get drawable from URL, that points to an image. But problem is, that in android you shouldn't execute network tasks on the main thread. Because of it, I use async/await block, but the error still occurs all the time. Here is the code:

page.Appearing += async(sender, ev3) =>                    {                        if ( GetToolbar == null ) return;                        GetToolbar.Subtitle = viewModel?.SubTitle;                        if ( viewModel == null ) return;                        if ( viewModel.AvatarUrl.Contains("?") && !viewModel.AvatarUrl.Contains("gravatar") )                            viewModel.AvatarUrl = viewModel.AvatarUrl                                .Substring(0, viewModel.AvatarUrl.IndexOf("?", StringComparison.Ordinal));                        //var stream = Context.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(viewModel.AvatarUrl));                        await SetLogo(viewModel); }private async Task SetLogo(PublicRepositoryPageViewModel viewModel)        {            var url = new URL(viewModel.AvatarUrl);            var connection = url.OpenConnection();            var stream = connection.InputStream;            var logo = await Drawable.CreateFromStreamAsync(stream, viewModel.Title +"_avatar");            GetToolbar.Logo = logo;        }

Exactly it occurs on this line:

var stream = connection.InputStream;

If I use OpenInputStream instead of it, then it throws Java.IO.FileNotFoundException: No content provider: https://avatars.githubusercontent.com/u/6516107

I have checked Internet permission.

It is Xamarin.Forms Android project

ANSWER:

await Task.Run(async() => {                            var url = new URL(viewModel.AvatarUrl);                            var connection = url.OpenConnection();                            var stream = connection.InputStream;                            var logo = await Drawable.CreateFromStreamAsync(stream, viewModel.Title +"_avatar");                            Device.BeginInvokeOnMainThread(()=>GetToolbar.Logo = logo);                        });

Viewing all articles
Browse latest Browse all 2

Latest Images

Trending Articles





Latest Images