2013-11-22 3 views
0

사용자를 인증하고 안정적인 웹 서비스를 사용하여 데이터를 가져 오는 간단한 로그인 화면이 있습니다. 웹 서비스는 잘 작동합니다. 데이터를 가져 와서 구문 분석하고 로컬 데이터베이스에 저장한다고합니다. 문제는 -이 모든 작업을하는 동안 화면에 활동 표시기를 추가하고 싶습니다. 액티비티 표시기를 추가 할 수는 있지만 문제는 웹 서비스를 호출하고 데이터를 가져 오는 뷰에 표시되지 않습니다.백그라운드 스레드에서 웹 서비스 호출 및 기본 스레드의 UI 업데이트

백그라운드에서 일을하는 동안 활동 표시기를 추가하려면 어떻게해야합니까 ??

는 또한

 MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{ 

      StartActivityIndicator(); 
      authenticateBtn.Enabled = false; 
      authenticateBtn.BackgroundColor = UIColor.Gray; 

     }); 
     // VALIDATE 
     bool isValid = ValidateTextbox(); 

     if (isValid == true) { 
      CreateUserAccount(); 
     } 

CreateUserAccount() 메소드가 웹 서비스를 호출 InvokeOnMainThread하고 데이터를 분석하려고 노력했다. 만약 내가 CreateUserAccount() 코드가 잘 작동하는 주석 줄, 나는 활동 표시기를 볼 수 있습니다. 하지만 CreateUserAccount() 메서드를 추가하면 작업 표시기가 나타나지 않습니다.

웹 서비스를 호출하고 UI 작업을 수행하는 방법.

답변

0

작업에서 웹 서비스 호출을 분리하면이 문제를 해결할 수 있습니다. 그러면 별도의 스레드에서 서비스 호출이 실행되고 완료되면 InvokeOnMainThread()를 호출하여 UI로 작업을 수행 할 수 있습니다.

이와 비슷한 기능이 UIViewController에 추가됩니다.

Task CallWebService() 
{ 
    return Task.Factory.StartNew(() => { 
     // make your service call. 
    }); 
} 

지금, 당신은 다음과 같이 당신의 viewDidLoad에서 이것을 호출 할 수 있습니다 라이브

// Inside ViewDidLoad method of your UIViewController 
// 
// Show your activity indicator first. 
StartActivityIndicator(); 
CallWebService().ContinueWith(task => { 

    if(task.isFaulted) 
     throw new AggregateException(task.Exception.InnerException.Message); 

    // Runs when the task is finished 
    InvokeOnMainThread(() => { 
     // Hide your activity indicator here. 
     StopActivityIndicator(); 
    }); 

}); 
+0

나는 앱에 들어가 자마자 웹 서비스를 호출하여 앱에 액세스하는 동안 서버에 저장되지 않은 데이터를 다시 게시해야하는 상황이 있습니다. 나는 사용자가 어떤보기든지에있을 수 있던대로 InvokeOnMainThread를 어디에 부르는 지 모른다. 어떻게 처리할까요? – User382

1

당신의 시간, 사용 C#5async/await : 당신이 CreateUserAccount에 전화를 걸 수

public async void DoSomething() 
{ 
    StartActivityIndicator(); 
    authenticateBtn.Enabled = false; 
    authenticateBtn.BackgroundColor = UIColor.Gray; 
    bool isValid = ValidateTextbox(); 

    if (isValid) 
     await CreateUserAccount(); 

    StopActivityIndicator(); 
} 
+0

또한 유효하지만 모든 사람이 아직 Xamarin 항목과 비동기를 사용하지는 않습니다. – therealjohn

+1

@ therealjohn 거기에 유효한 이유가 없습니다 :) –

0

배경 작업자

var worker = new BackgroundWorker(); 
worker.DoWork += (s, ev) => ConnectToPanel(); 
worker.RunWorkerAsync(); 
관련 문제