質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1067閲覧

asyncメソッドの処理を完了させてから処理を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/01/08 06:26

#開発環境
Visual Studio 2017 Community 15.9.4
Xamarin.Forms 3.4.0.1009999
Xamarin.Forms.GoogleMaps 3.0.4
Xam.Plugin.Geolocator 4.5.0.6

#やりたいこと
Xamarin.Formsを用いて地図を表示するAndroidアプリを作成しています。
地図の初期表示の位置をGPSから取得する処理と、サーバーと通信してユーザーの情報を取得し、画面遷移の先を変える処理を作りたいのですが、処理の順序が想定と異なり上手く行きません。
ユーザーの情報を入力する画面は最初の1度のみ表示し、以降はロード画面に飛ばすようにしています。

#コード
ロード画面のXAML

XAML

1<?xml version="1.0" encoding="utf-8" ?> 2<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 3 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 4 x:Class="App.Load" 5 Title="データ確認中"> 6 <ContentPage.Content> 7 8 <AbsoluteLayout> 9 10 <ActivityIndicator x:Name="Indicator" 11 IsRunning="True" 12 Color="Gray" 13 AbsoluteLayout.LayoutBounds=".5,.5,.5,.5" 14 AbsoluteLayout.LayoutFlags="All"/> 15 16 </AbsoluteLayout> 17 18 </ContentPage.Content> 19</ContentPage>

ロード画面のC#

C#

1namespace App 2{ 3 [XamlCompilation(XamlCompilationOptions.Compile)] 4 public partial class Load : ContentPage 5 { 6 public Load() 7 { 8 InitializeComponent(); 9 10 string permission = GetPermission(); 11 12 Task task = GetPosition(); 13 14 // 何故かTask.Runの中に入れないと上手く画面遷移しない 15 Task.Run(() => 16 { 17 if (permission == "admin") 18 { 19 Application.Current.MainPage = new Admin.Home(); 20 } 21 else 22 { 23 Application.Current.MainPage = new User.Home(); 24 } 25 }); 26 } 27 28 public async Task GetPosition() 29 { 30 // https://itblogdsi.blog.fc2.com/blog-entry-361.html を元に実装 31 DependencyService.Get<ILocationService>().Initialize(); 32 Plugin.Geolocator.Abstractions.Position pos = await DependencyService.Get<ILocationService>().GetPositionAsync(1000); 33 34 GlobalClass.Instance.CurrentLatitude = pos.Latitude; 35 GlobalClass.Instance.CurrentLongitude = pos.Longitude; 36 } 37 38 public async string GetPermission() 39 { 40 HttpClient client = new HttpClient(); 41 42 var param = new Dictionary<string, string>(); 43 param.Add("UserID", "1111"); 44 45 var content = new FormUrlEncodedContent(param); 46 47 var response = await client.PostAsync($"https://example.com/send.php", content); 48 49 return await response.Content.ReadAsStringAsync(); 50 } 51 } 52}

#試したこと
Task task = GetPosition().Wait();
などにしてみましたがデッドロックが発生して動かなくなりました。

#知りたいこと
GetPermission・GetPositionの処理が終了してからMainPageの遷移をする方法。
このままだと画面がロードされずActivityIndicatorが表示されないため、出来ればそれを表示する方法も知りたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OnAppearingで処理を行えばいいと思います。

C#

1protected override async void OnAppearing() 2{ 3 base.OnAppearing(); 4 5 string permission = await GetPermission(); 6 7 await GetPosition(); 8 9 if (permission == "admin") 10 { 11 Application.Current.MainPage = new Admin.Home(); 12 } 13 else 14 { 15 Application.Current.MainPage = new User.Home(); 16 } 17}

ただし、OnAppearingは、Androidではバックグラウンドから復帰した時なども呼び出されるので、フラグを持たせて初回の一回のみ動くようにしておいた方が安全です。

あと、GetPermissionの戻り値は、Task<string>にしてください。

投稿2019/01/08 10:04

編集2019/01/08 10:11
f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/09 06:12

ありがとうございます! やりたいことが出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問