2016-06-15 3 views
4

내 xamarin 폼 프로젝트 (android 및 ios)에 ShowLoading() Acr UserDialogs (v5.2.2)를 사용하지만 메소드를 시작하기 전에 로더를 시작하지 않으려면 숨기기 로더 끝.Show Acr User Dialogs 로더 끝까지 메서드 xamarin 폼 (안드로이드)

내 코드는 ios에서 작동하지만 Android에서는 작동하지 않습니다.

예를 들어 내가

어떤 도움 MainActivity.cs

에 안드로이드 UserDialogs.Init (이)에 대한하시기 바랍니다 추가

async Task MyMethod() 
{ 
    UserDialogs.Instance.ShowLoading("Loading",MaskType.Black); 
    await ViewModel.LoadData(); 
    UserDialogs.Instance.HideLoading(); 
} 

//InsideViewModel 
public async Task LoadData(); 
{ 
await Task.Yield(); //without this code and ios doesnt work 
//download data 
} 

? 감사합니다.

+0

Nope. 귀하의 대답은 내 질문에 문제가되지 않습니다. –

+0

이 질문에 대한 정답으로 내 게시물을 표시해주세요. 그 StackOverflow 끈 연습. 정말 감사합니다 – jzeferino

답변

2

정말 빠르고 ACR 사용자 대화 상자와 완벽한 작업 일부 코드를 작성 :

0

await Task.Yield();을 사용해야하지 않아도됩니다.

이 시도하십시오

async Task MyMethod() 
{ 
    UserDialogs.Instance.ShowLoading("Loading", MaskType.Black); 
    await ViewModel.LoadData(); 
    UserDialogs.Instance.HideLoading(); 
} 

//InsideViewModel 
public async Task LoadData() 
{ 
    await DownloadFileAsync("http://url.to.some/file.mp3", "file.mp3"); 
} 

public async Task DownloadFileAsync(string url, string filename) 
{ 
    var destination = Path.Combine(
    System.Environment.GetFolderPath(
     System.Environment.SpecialFolder.ApplicationData), 
     filename); 

    await new WebClient().DownloadFileTaskAsync(new Uri(url), destination); 
} 
0

이 일반적인 문제입니다. 실제로 종종 비동기로 혼란 스러우며 배경을 기다리고 있습니다. 실제로는 비동기적일 수있는 장기 실행 작업을보다 잘 제어 할 수 있습니다. 당신은 여전히 ​​그렇지 않으면 MyMethod라는이 페이지 인스턴스 내에서하고 MyMethod라는 명령을 통해 UIThread에서 호출 또는 핸들러를 클릭되고 난 가정

async Task MyMethod() 
{ 
    UserDialogs.Instance.ShowLoading("Loading",MaskType.Black); 
    await ViewModel.LoadData(); 
    UserDialogs.Instance.HideLoading(); 
} 

//InsideViewModel 
public async Task LoadData(); 
{ 
Task.Run(()=> //download data;); 
} 

즉, UI 스레드를 차단할 수있는 별도의 스레드로 작업 항목을 둘 필요 .

async Task MyMethod() 
{ 
    using(UserDialogs.Instance.ShowLoading("Loading",MaskType.Black)) 
    { 
    await ViewModel.LoadData(); 
    } 
} 

//InsideViewModel 
public async Task LoadData(); 
{ 
    await Task.Yield(); //without this code and ios doesnt work 
    //download data 
} 
2

나는 더 우아한 방법을 사용합니다.

나는 depedency 서비스를 사용하며 여기에 전체 샘플 코드가 있습니다.

PCL 코드

void CallService() 
    { 
     Device.BeginInvokeOnMainThread (() => UserDialogs.Instance.ShowLoading ("Loading ...", MaskType.Black)); 
     Task.Run (async() => { 
      await DependencyService.Get<IJsonMethods>().Load ("SERVICE_URL"); 
     }).ContinueWith (result => Device.BeginInvokeOnMainThread (() => { 

      UserDialogs.Instance.HideLoading(); 

      } 
     }) 
     ); 
    } 

인터페이스

단지 iOS 용
public interface IJsonMethods 
{ 
    Task Load(string url); 
} 

종속성 서비스

public async Task Load (string url) 
    { 
     try{ 
      using (var http = new HttpClient (new NativeMessageHandler())) { 
       var x = await http.GetAsync (new Uri (url)); 
       string res = await x.Content.ReadAsStringAsync(); 
       MainViewModel.JsonList = JsonConvert.DeserializeObject<ArticleClass.RootObject> (res); 
      } 
     }catch (Exception ex) { 
      MainViewModel.JsonList = null; 
     } 
    } 
0

, 요 사용할 수 있습니다 ~~ Device.BeginInvokeOnMainThread (새 작업 (FunctionName)); ~ 아무런 예외없이 UI 스레드에서 데이터를로드 할 수 있습니다. 그냥 시도하고 그것을했습니다. 그리고 대화 상자를 사용하기 위해서는 Device.BeginInvokeOnMainThread (~~ UserDialogs.Instance.ShowLoading() ~)를 이와 같이 변경하고 그에 따라 함수 내부를 변경하십시오.