2011-04-11 7 views
0

J'ai un problème lorsque j'appelle le service Web de manière asynchrone dans Monodroid. L'appel semble fonctionner correctement, mais l'application se bloque à chaque fois que je traite la réponse. Le programme se comporte différemment quand je le lance en émulateur et quand je le lance sur mon téléphone (Samsung Galaxy S w 2.2.1 FROYO.XWJS8). Je pense à creter les discussions par moi-même, mais je ne sais pas si cela résout le problème. Le même code fonctionne très bien lorsqu'il est utilisé dans l'application Windows Phone 7.Appel de service Web asynchrone dans l'adaptateur de liste personnalisée

Le code pour l'appel de méthode Async est (note: en réalité, les appels showMessage écrire à Android.Util.Log.Debug)

private void callws(string _input) 
{ 
    MessageBox.GetInstance().ShowMessage("Search async started, input: " + _input); 
    m_waitingrequest = new RequestStatus() { Waiting = true, NewestInput = _input, OriginalInput = _input }; 
    connectormobile.UserInformation ui = new connectormobile.UserInformation() 
     { UserName = m_appsettings.GetValue<string>(AppSettings.WS_USERNAME_NAME), Password = m_appsettings.GetValue<string>(AppSettings.WS_PASSWORD_NAME) }; 
    MessageBox.GetInstance().ShowMessage("Username: " + ui.UserName + " Password: " + ui.Password); 
    m_client.SearchAsync(ui, _input); 
    MessageBox.GetInstance().ShowMessage("After search async call, input: " + _input); 
} 

Fonction de recherche de résultat Async commence par:

void m_client_SearchCompleted(object sender, connectormobile.SearchCompletedEventArgs e) 
{ 
      MessageBox.GetInstance().ShowMessage("Search async completed"); 
      SearchCache.CacheElement element = new SearchCache.CacheElement(); 
      element.SearchCriteria = m_waitingrequest.OriginalInput; 
      element.PartialResponse = e.Result.PartialResponse; 

      if (e.Result.CompanyNameInfoArray == null) 
       element.Rows = new List<connectormobile.CompanyNameInfo>(); 
      else 
       element.Rows = e.Result.CompanyNameInfoArray.ToList(); 
      MessageBox.GetInstance().ShowMessage("Search async returned, partial response: " + e.Result.PartialResponse 
       + " row count: " + element.Rows.Count + " return value: " + e.Result.ReturnValue.ErrorDescriptionFi); 
} 

Cette est où le programme se comporte différemment. Dans l'émulateur, le code n'atteint jamais la première ligne de SearchCompleted. Mais dans mon téléphone la fonction SearchCompleted semble passer (au moins toutes mes lignes de débogage sont en trace), mais après cela l'interface utilisateur se fige. (et après minute il dit que le processus ne répond pas)

+0

Je pense que nous aurons besoin d'un test complet pour diagnostiquer plus cela. Pourriez-vous déposer un bug via http://mono-android.net/Support avec une application de test complète et autonome? Merci. – jonp

Répondre

0

Vous essayez probablement de modifier l'interface utilisateur à partir du thread d'arrière-plan au lieu du thread UI. Utilisez RunOnUIThread() pour faire votre logique de l'interface utilisateur sur le fil correct:

http://mono-android.net/Documentation/Guides/Writing_Responsive_Applications

+0

N'a pas aidé. La seule chose que je fais à l'interface utilisateur est appel Adapters m_context.RunOnUiThread (() => this.NotifyDataSetChanged()); –

+0

Mais l'application n'a jamais atteint cette ligne dans le code. –

Questions connexes