0

Monodroid で Web サービスを非同期に呼び出すときに問題が発生します。呼び出しは正しく機能しているように見えますが、応答を処理するたびにアプリケーションがクラッシュします。エミュレーターで実行した場合と、電話 (Samsung Galaxy S w 2.2.1 FROYO.XWJS8) で実行した場合とでは、プログラムの動作が異なります。自分でスレッドを作成しようと考えていますが、問題が解決するかどうかわかりません。Windows Phone 7 アプリケーションで使用すると、同じコードが正常に機能します。

Async メソッド呼び出しのコードは次のとおりです (注: 実際には、ShowMessage 呼び出しは 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);
}

検索非同期結果関数は次で始まります。

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);
}

ここで、プログラムの動作が異なります。エミュレーターでは、コードが SearchCompleted の最初の行に到達することはありません。しかし、私の電話では、SearchCompleted 関数は通過しているように見えます (少なくともすべてのデバッグ行がトレースされています) が、その後、ユーザー インターフェイスがフリーズします。(そして数分後、プロセスが応答していないと表示されます)

4

1 に答える 1

0

UI スレッドではなく、バックグラウンド スレッドから UI を変更しようとしている可能性があります。RunOnUIThread () を使用して、正しいスレッドで UI ロジックを実行します。

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

于 2011-04-11T15:27:21.283 に答える