Android错误:检测到嵌套信号-正在报告原始信号

本文关键字:信号 报告 原始 嵌套 错误 检测 Android | 更新日期: 2023-09-27 17:59:56

这简直要了我的命。我是android/Xamarin的新手。我在网上找不到任何解释这里发生了什么的东西。

我的申请使用xamarin表格。我有一个将设备与web服务同步的页面。

该方法只需一次从web服务中检索100条记录,并更新设备上的sqlite表。我随机得到这个错误。我正在为我的测试样本运行5000条记录。

点击这里的按钮:

 public async void OnSyncCachedData_Clicked(object sender, EventArgs e)
    {
        activityIndicatorAll.IsRunning = true;
        try
        {
            actIndSyncItems.IsRunning = true;
            SyncAllFinished += SynchAllFinishedProcessing;
            await Task.Run(async () => await App.ItemsRepo.LoadCacheDataFromCacheAsync(DbPath).ConfigureAwait(false));
        }
        catch (BAL.Exceptions.NetworkException nex)
        {
            await DisplayAlert(Messages.TitleError, nex.Message, Messages.MsgOk);
        }
        catch (Exception ex)
        {
            await DisplayAlert(Messages.TitleError, string.Format(Messages.MsgAreYouConnectedParm1, ex.Message), Messages.MsgOk);
        }
        finally
        {
            EventHandler handler = SyncAllFinished;
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
            SyncAllFinished -= SynchAllFinishedProcessing;
        }
    }

主要的工人方法:

public async Task<bool> LoadCacheDataFromCacheAsync(string dbPath)
    {
        WebSvcManagers.ItemsManager itemsWebServiceManager = new WebSvcManagers.ItemsManager();
        List<Models.WebServiceItems> consumedRecords = new List<Models.WebServiceItems>() { };
        int bufferSize = 100;
        Log.Debug(TAG, "LoadCacheDataFromCacheAsync starting");
        try
        {
            {
                int lastID = 0;
                IEnumerable<Models.WebServiceItems> remoteRecords = await BAL.DataAccessHelper.GetItemsFromGPCacheAsync(App.Login, lastID, bufferSize, itemsWebServiceManager).ConfigureAwait(false);
                while (remoteRecords.Count() != 0)
                {
                    foreach (Models.WebServiceItems remoteItem in remoteRecords)
                    {
                        // DbActionTypes dbAction = (DbActionTypes)remoteItem.DbAction;
                        Models.Items itemRecord = new Models.Items() { ItemNumber = remoteItem.ItemNumber.ToUpper().Trim(), Description = remoteItem.Description.Trim() };
                        Log.Debug(TAG, "Processing {0}", remoteItem.ItemNumber.Trim());
                        bool success = await AddRecordAsync(itemRecord).ConfigureAwait(false);
                        if (success)
                            consumedRecords.Add(remoteItem);
                    }
                    lastID = remoteRecords.Max(r => r.RecordID) + 1;
                    remoteRecords = await BAL.DataAccessHelper.GetItemsFromGPCacheAsync(App.Login, lastID, bufferSize, itemsWebServiceManager).ConfigureAwait(false);
                }
            }
           // await UpdateConsumedRecords(consumedRecords).ConfigureAwait(false);
            return true;
        }
        catch (Exception ex)
        {
            this.StatusMessage = ex.Message;
            Log.Debug(TAG, "Error Catch: {0}", StatusMessage);
            return false;
        }
        finally
        {
            itemsWebServiceManager = null;
            HandleSyncFinished(this, new EventArgs());
            SyncAllFinished -= HandleSyncFinished;
        }
    }

我的简单网络服务经理:

        public static async Task<IEnumerable<Models.WebServiceItems>> GetItemsFromGPCacheAsync(Models.Login login, int offset, int bufferCount, WebSvcManagers.ItemsManager manager)
    {
        try
        {
            return await manager.GetCacheRecordsAsync(login, offset, bufferCount).ConfigureAwait(false);
        }
        catch (Exception)
        {
            throw;
        }
    }

与web服务交互的代码:

const int bufferSize = 100;
        public async Task<IEnumerable<Models.WebServiceItems>> GetCacheRecordsAsync(Models.Login login, int offSet, int bufferCount)
    {
        string deviceID = App.ConfigSettings.DeviceID.ToString("D");
        try
        {
            ///* Testing start */
            //return await DataStore(bufferCount, offSet).ConfigureAwait(false);
            ///* Testing end */
            if (!App.IsConnected)
                throw new BAL.Exceptions.NetworkException(Messages.ExceptionNetworkConnection);
            string user = login.UserName;
            string password = login.Password;
            HttpClient client = HttpClientExtensions.CreateHttpClient(user, password);
            try
            {
                List<Models.WebServiceItems> items = new List<Models.WebServiceItems>() { };
                int lastID = offSet;
                int i = 0;
                string uri = string.Format("{0}", string.Format(Messages.WebRequestItemsCacheParms3, deviceID, lastID, Math.Min(bufferCount, bufferSize)));
                Log.Debug(TAG, string.Format("Webservice {0}", uri));
                string response = await client.GetStringAsync(uri).ConfigureAwait(false);
                while (i < bufferCount && response != null && response != "[]")
                {
                    while (response != null && response != "[]")
                    {
                        dynamic array = JsonConvert.DeserializeObject(response);
                        foreach (var item in array)
                        {
                            i++;
                            items.Add(new Models.WebServiceItems()
                            {
                                ItemNumber = item["ITEMNMBR"].Value.Trim(),
                                Description = item["ITEMDESC"].Value.Trim(),
                                DbAction = (int)(item["DbAction"].Value),
                                RecordID = (int)(item["DEX_ROW_ID"].Value),
                            });
                            lastID = (int)(item["DEX_ROW_ID"].Value);
                            Log.Debug(TAG, string.Format("Webservice {0}", item["ITEMNMBR"].Value.Trim()));
                        }
                        if (i < Math.Min(bufferCount, bufferSize))
                        {
                            uri = string.Format("{0}", string.Format(Messages.WebRequestItemsCacheParms3, deviceID, lastID + 1, Math.Min(bufferCount, bufferSize)));
                            Log.Debug(TAG, string.Format("Webservice {0}", uri));
                            response = await client.GetStringAsync(uri).ConfigureAwait(false);
                        }
                        else
                            break;
                    }
                }
                Log.Debug(TAG, string.Format("Webservice return {0} items", items.Count()));
                return items;
            }
            catch (Exception ex)
            {
                Log.Debug(TAG, "Error Catch: {0}", ex.Message);
                throw ex;
            }
        }
        catch (System.Net.Http.HttpRequestException nex)
        {
            throw new Exception(string.Format(Messages.ExceptionWebServiceLoginParm1, nex.Message));
        }
        catch (Exception)
        {
            throw;
        }
    }

我得到了Xamarin教练的帮助,我们以为我们得到了它(因为这是随机的),但它显然没有被拍到。三个多星期以来,我的头一直撞在墙上。它闻起来像内存泄漏,但我不知道如何找到它,因为它是一条不会出现在网络搜索中的通用错误消息。

有个有主脑的人,请帮帮我!

错误:

08-03 12:41:11.281 D/X:ItemsRepositiory(16980): UpdateRecordAsync 65702-40710 
08-03 12:41:11.306 D/X:ItemsManager(16980): Webservice DeleteCacheRecordAsync 20497 
08-03 12:41:11.406 D/X:ItemsManager(16980): Webservice api/InventoryItems?DeviceID=7c5bb45d-2ea0-45b9-ae50-92f2e25a2983&OffSet=20498&Ma‌​x=100&cached=true 
Thread finished: <Thread Pool> #7 08-03 12:41:11.521 E/art (16980): Nested signal detected - original signal being reported The thread 'Unknown' (0x7) has exited with code 0 (0x0).

Android错误:检测到嵌套信号-正在报告原始信号

这可能是VS Android Emulator的问题。正如我们在测试中所显示的,这在谷歌安卓模拟器、Xamarin安卓播放器和物理安卓设备上都是不可复制的。