简体   繁体   中英

Xamarin forms Crash when user exit screen and come back after PUT process

My XF app crash when user try to open any screen after finishing update data in one specific screen, the others works well.

Only I got is : "08-20 23:41:19.211 W/art (15347): JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable".

No HokeyApp message received in my email and no extra information appears so I can solve the problem, just crash and close the app.

I tried to decrease the amount of requests to local database, tried to follow step by step the execution process so I could get any clue about causes.

Task act = Task.Run(async () => await App.DataService.UpdateItemAsync(CP, ToServer, "Contact_Party/EditContact_Party/" + CP.Id));

            await act.ContinueWith(async (antecedent) =>
            {
                foreach (var sam in specialty)
                {

                    if (CP.Id > 0)
                    {
                        sam.Cntct_SEQ = CP.Id;
                    }
                    else
                    {
                        sam.Tmp_Cntct_SEQ = CP.Cntct_SEQ;
                    }

                    if (sam.Id == 0)
                    {
                        if (sam.Cntct_Spec_SEQ == 0)
                            await App.DataService.CreateItemAsync(sam, ToServer, "Contact_Specialty/AddContact_Specialty");
                        else
                        {
                            await App.DataService.UpdateItemAsync(sam, ToServer, "Contact_Specialty/EditContact_Specialty/" + sam.Id);
                        }
                    }
                    else
                    {
                        await App.DataService.UpdateItemAsync(sam, ToServer, "Contact_Specialty/EditContact_Specialty/" + sam.Id);
                    }
                }
            }, TaskContinuationOptions.None); 

Below is the other code or the final step in Update data...

public async Task<T> UpdateItemAsync<T>(T item, bool ToServer, string url) where T : BaseModel, new()
    {
        try
        {
            HttpResponseMessage hrm = new HttpResponseMessage();

            if (!CrossConnectivity.Current.IsConnected)
                ToServer = false;

            if (ToServer)
            {
                RestURL = PrimaryRestURL;

                RestURL += url;

                var content = JsonConvert.SerializeObject(item);

                content = content.Replace("null", " ");

                try
                {
                    hrm = await _client.PutAsync(RestURL, new StringContent(content, System.Text.Encoding.UTF8, "application/json"));

                    RestURL = PrimaryRestURL;
                }
                catch (Exception hre)
                {
                    RestURL = PrimaryRestURL;

                    ContentPage page = new ContentPage();

                    string inner = "", source = "", trace = "", data = "";

                    if (hre.InnerException != null)
                        inner = hre.InnerException.Message;

                    data = hre.Data.ToString();

                    source = hre.Source;

                    trace = hre.StackTrace;

                    string msg = "RestURL: " + RestURL + "\n\n Data: " + data + "\n\n Message: " + hre.Message + "\n\n Source: " + source + "\n\n Trace: " + trace + "\n\n Inner Message: " + inner;

                    await page.DisplayAlert("Error", msg, "Ok");
                }

                if (hrm.StatusCode == System.Net.HttpStatusCode.OK || hrm.StatusCode == System.Net.HttpStatusCode.NoContent)
                {
                    item.Updated = true;

                    await database.UpdateAsync(item);

                    DependencyService.Get<IMessage>().LongAlert("Completed");
                }
                else
                {
                    item.Changed = true;

                    await database.UpdateAsync(item);

                    DependencyService.Get<IMessage>().LongAlert("Error connection to server");
                }
            }
            else
            {
                item.Changed = true;

                await database.UpdateAsync(item);

                DependencyService.Get<IMessage>().LongAlert("Completed");
            }


        }
        catch (Exception xc)
        {
            ContentPage page = new ContentPage();

            string inner = "", source = "", trace = "", data = "";

            if (xc.InnerException != null)
                inner = xc.InnerException.Message;

            data = xc.Data.ToString();

            source = xc.Source;

            trace = xc.StackTrace;

            string msg = "RestURL: " + RestURL + "\n\n Data: " + data + "\n\n Message: " + xc.Message + "\n\n Source: " + source + "\n\n Trace: " + trace + "\n\n Inner Message: " + inner;

            await page.DisplayAlert("Error", msg, "Ok");
        }

        return item;
    }

Finally, I solved the issue, it was because I wanted to make the process of updating in a task so being continues with sub updates, after implementeing each update process alone it work ... the code that produced the issue is:

                Task act = Task.Run(async () => await App.DataService.UpdateItemAsync(CP, ToServer, "Contact_Party/EditContact_Party/" + CP.Id));

                await act.ContinueWith(async (antecedent) =>
                {
                    foreach (var sam in specialty)
                    {

                        if (CP.Id > 0)
                        {
                            sam.Cntct_SEQ = CP.Id;
                        }
                        else
                        {
                            sam.Tmp_Cntct_SEQ = CP.Cntct_SEQ;
                        }

                        if (sam.Id == 0)
                        {
                            if (sam.Cntct_Spec_SEQ == 0)
                                await App.DataService.CreateItemAsync(sam, ToServer, "Contact_Specialty/AddContact_Specialty");
                            else
                            {
                                await App.DataService.UpdateItemAsync(sam, ToServer, "Contact_Specialty/EditContact_Specialty/" + sam.Id);
                            }
                        }
                        else
                        {
                            await App.DataService.UpdateItemAsync(sam, ToServer, "Contact_Specialty/EditContact_Specialty/" + sam.Id);
                        }
                    }
                }, TaskContinuationOptions.None); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM