自定义列表适配器中的异步Web服务调用

时间:2011-04-11 13:25:54

标签: xamarin.android

在Monodroid中异步调用Web服务时遇到问题。调用似乎工作正常,但每次处理响应时应用程序都会崩溃。当我在模拟器中运行它并在手机上运行它时,程序的行为会有所不同(三星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功能似乎已经完成(至少我的所有调试行都在跟踪中),但之后用户界面冻结了。 (并且在一分钟之后它表示流程没有响应)

1 个答案:

答案 0 :(得分:0)

您可能正在尝试从后台线程而不是UI线程修改UI。使用RunOnUIThread()在正确的线程上执行UI逻辑:

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