0

웹 서비스의 데이터를 가져온 Xamarin Android 응용 프로그램을 가지고 목록보기에 바인딩합니다.Xamarin.Android : 비동기 작업에서 처리되지 않은 예외를 throw합니다.

MainActivity.cs의 방법은 다음

MainActivity에서
private async Task LoadDataFromService() 
{ 

    int userId = int.Parse(applicationData[USER_ID]); // Shared prefrenced data 

    //ASYNC Method getting data from JSON and converting it into Sales Object 
    Task<IList<Sales>> apiDataTask = UserData.GetSales(userId); 
    IList<Sales> apiData = await apiDataTask; 
    if (apiData != null) 
    { 
     salesList = apiData as List<Sales>; 
     dbManager.Update(salesList); //Sync with SQLite DB 

    } 
} 

나는이 작업을 식별자를 제공하는 글로벌 변수를 정의

public class MainActivity : Activity 
{ 
    private Task loadData; 
} 

다음과 같이 그리고 나는이를 호출하고 :

public class MainActivity : Activity 
{ 
    private Task loadData; 
    protected override void OnCreate(Bundle bundle) 
    { 
     loadData = new Task(async() => { await LoadDataFromService(); }); 
    } 
} 

그런 다음 데이터가 다운 될 때까지 기다려야합니다. ded 한 다음 데이터를 ListView에 넣습니다.

protected override void OnStart() 
{ 
    base.OnStart(); 
    loadData.Start(); // This is causing to generate an exception 
    loadData.ContinueWith(t => { BindData(); }).Wait(); 
} 

유일한 문제 내가 무엇입니까

는 메시지가 An unhandled exception occured. 말하는 unhanled 예외로 끝나는 것입니다, ONSTART 해고 후 메시지가 와서 문제가있을 수 있습니다에 대한 표시가 없습니다.

답변

1

이 메시지는 매우 열악하기 때문에 무엇이 예외를 유발하는지 잘 모르겠습니다. 하지만 문제를 해결해야하며 코드를 실행하기에 충분할 수도 있습니다. OnStart() 방법에서는 .Wait();을 사용하고 있습니다. 교착 상태가 발생할 수 있으며 UI가 차단됩니다. here에 대해 더 자세히 읽어보십시오. 또한 나는 당신이 당신의 작업을 저장할 필요가 없다고 생각합니다. OnStart()에서 기다릴 수 있습니다.

그래서 OnStart(); 다음을 추천 할 것입니다 :

protected override async void OnStart() 
{ 
    base.OnStart(); 

    var data = await LoadDataFromService(); 
    BindingData();  
} 

또한이 모든 비동기 방법이 끝나는 것으로 비동기로 명명 된 규칙입니다. 아마도 이것은 당신을 도울 수 있습니다. 그래도 문제가 해결되지 않으면 내부 예외를 찾아보십시오. Exception을 디버그하고 속성 "InnerException"을 선택하여 확인하십시오.

+0

답변 해 주셔서 감사합니다. 것은 내가 만들고있는 응용 프로그램이 온라인과 오프라인 모두에서 작동한다는 것입니다. 따라서 연결을 확인하고 비동기 메소드가 실행됨을 기반으로합니다. 그런 이유로 저는 OnStart를 비동기로 만들고 싶지 않았습니다. 비동기로 만들면 오프라인에서도 동일한 방식으로 수행됩니까? – progrAmmar

+0

@progrAmmar 예. 문제 없습니다. 오프라인에서도 비동기로 만들 수 있습니다. Async는 컴파일러에게 알리고 아무 것도하지 않습니다. 멀리 귀하의 방법에 도달 기다리고있다 그것은 동기화를 수행하고 아무것도 비동기를 실행합니다. wait는 메소드를 비동기로 만듭니다. 따라서 대기 상태 인 경우 비동기 표시된 메소드 동기화를 쉽게 실행할 수 있습니다. – Sebi

관련 문제