C#Xamarin-当关闭ProgressDialog时,应用程序崩溃

C#Xamarin-当关闭ProgressDialog时,应用程序崩溃,c#,android,xamarin,progressdialog,C#,Android,Xamarin,Progressdialog,我正在开发一个android Xamarin应用程序。我的应用程序连接到我的网站,因为它持续时间很长,所以我使用ProgressDialog。但是当ProgressDialog关闭时,应用程序崩溃。我不明白为什么。我试图捕捉错误,但应用程序也崩溃了。(对不起我的英语) 下面是代码: ProgressDialog load; void FTPConnection() { load = new ProgressDialog(this);

我正在开发一个android Xamarin应用程序。我的应用程序连接到我的网站,因为它持续时间很长,所以我使用
ProgressDialog
。但是当
ProgressDialog
关闭时,应用程序崩溃。我不明白为什么。我试图捕捉错误,但应用程序也崩溃了。(对不起我的英语)

下面是代码:

ProgressDialog load;
void FTPConnection()
        {
            load = new ProgressDialog(this);
            load.SetTitle("Načítání");
            load.SetMessage("Spojování s ftp://kolemzeme.wz.cz, může to chvíli trvat...");
            load.SetCancelable(false);
            load.SetProgressStyle(ProgressDialogStyle.Spinner);
            load.Show();

            new Thread(new ThreadStart(async delegate
            {
                await Task.Delay(1000);
                try
                {
                    using (WebClient client = new WebClient())
                    {
                        Stream stream = client.OpenRead("http://" + web);
                        stream.Close();
                    }
                    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + web + "/cesta.txt");
                    request.Credentials = new NetworkCredential(web, pass);
                    request.UseBinary = true;
                    request.UsePassive = true;
                    request.Method = WebRequestMethods.Ftp.GetFileSize;
                    try
                    {
                        FtpWebResponse respose = (FtpWebResponse)request.GetResponse();
                        RunOnUiThread(() =>
                        {
                            load.Dismiss();
                        });
                        NaCeste();
                    }
                    catch (WebException ex)
                    {
                        RunOnUiThread(() =>
                        {
                            load.Dismiss();
                        });
                        FtpWebResponse response = (FtpWebResponse)ex.Response;
                        SetContentView(Resource.Layout.Cesta);
                        Cesta();
                    }
                }
                catch (Exception ex)
                {
                    RunOnUiThread(() => 
                    {
                        load.Dismiss();
                    });
                    load.Dismiss();
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.SetTitle("Nelze se připojit na FTP!")
                           .SetMessage("Aplikace nemůže navázat přístup k serveru FTP: http://kolemzeme.wz.cz\n\nPravděpodobně nemáte internet, nebo je server nyní nedostupný. Zkuste to později.\n\nError: " + ex.Message)
                           .SetCancelable(false)
                           .SetPositiveButton("Připojit se k wifi", delegate
                           {
                               Intent i = new Intent(Android.Provider.Settings.ActionWifiSettings);
                               StartActivityForResult(i, 0);
                               FTPConnection();

                           })
                           .SetNeutralButton("Opakovat", delegate
                           {
                               FTPConnection();
                           })
                           .SetNegativeButton("Odejít", delegate
                           {
                               Finish();
                           })
                           .Show();
                }
            })).Start();
        }
错误截图

您在UI线程上运行了一个
disclose
调用,还有一个没有。您需要删除第二个

更好的做法是将异常处理的全部移动到UI线程。因此,改变:

RunOnUiThread(() =>
{
    load.Dismiss();
});
FtpWebResponse response = (FtpWebResponse)ex.Response;
SetContentView(Resource.Layout.Cesta);
Cesta();
致:


(例如,您需要对所有catch块进行这种样式的更改)

因为您正在启动一个新线程,请确保在UI线程上调用
.disease
,即类似于
this.RunOnUiThread(()=>{load.disease();})
将是您的活动…(关于UI创建/更新/等…需要放在UI Looper线程上)感谢您的回答,但它仍然不起作用。在进行建议的更改后,您可以用代码向我们显示您的代码(更新您的帖子)吗?好的,我编辑了我的帖子。当我启动应用程序时,它显示
ProgressDialog
,几秒钟后应用程序崩溃。错误的屏幕截图是屏幕截图中的代码不包含我建议的代码更改。你能展示我建议的代码更改的截图吗?哦,对不起,这是旧截图。是错误的新屏幕截图。我没有看到您更改了解决方案。现在开始工作了,非常感谢!
RunOnUiThread(() =>
{
    load.Dismiss();
});
FtpWebResponse response = (FtpWebResponse)ex.Response;
SetContentView(Resource.Layout.Cesta);
Cesta();
RunOnUiThread(() =>
{
    load.Dismiss();
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    SetContentView(Resource.Layout.Cesta);
    Cesta();
});