繁体   English   中英

应用程序可在模拟器上运行,在设备上崩溃

[英]App works on emulator, crashes on device

我有一个奇怪的问题。 我正在编码应用程序,它使用Web上的XML。 在Emulator上一切正常,但在电话上会崩溃(单击按钮后关闭,没有任何警报)。

这是代码:

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Xml;

namespace KursyWalut
{
 [Activity (Label = "KursyWalut", MainLauncher = true, Icon = "@drawable/icon")]
 public class MainActivity : Activity
 {
   protected override void OnCreate (Bundle bundle)
   {
     base.OnCreate (bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Popularne);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button> (Resource.Id.przycisk);
        TextView data = FindViewById<TextView> (Resource.Id.data);
        TextView kurs = FindViewById<TextView> (Resource.Id.kurs);
        RadioGroup radioGroup = FindViewById<RadioGroup> (Resource.Id.radioGroup);
        RadioButton dolar = FindViewById <RadioButton> (Resource.Id.rbDolar);
        RadioButton euro = FindViewById <RadioButton> (Resource.Id.rbEuro);
        RadioButton frank = FindViewById <RadioButton> (Resource.Id.rbFrank);
        int checkedRadioButton;

        XmlDocument dokument = new XmlDocument ();

        //  --------------------------------------------------------------------------
        button.Click += delegate {
            try{
                dokument.Load("http://nbp.pl/kursy/xml/LastA.xml");
            }
            catch(Exception ex){
                Toast.MakeText(this,"Brak połaczenia z Internetem!",ToastLength.Long);
            }
            data.Text = "Data: " + getDocumentDate(dokument);

            checkedRadioButton = radioGroup.CheckedRadioButtonId;
            switch(checkedRadioButton){

            case Resource.Id.rbDolar:
                kurs.Text = "Kurs USD: " + getRate(dokument,"USD");
                break;

            case Resource.Id.rbEuro:
                kurs.Text = "Kurs EUR: " + getRate(dokument,"EUR");
                break;

            case Resource.Id.rbFrank:
                kurs.Text = "Kurs CHF: " + getRate(dokument,"CHF");
                break;
            }
        };
    }
    String getDocumentDate(XmlDocument xml){
        return xml.SelectSingleNode("/tabela_kursow/data_publikacji").InnerText;
    }

    String getRate(XmlDocument xml, String currency){
        foreach (XmlNode xmlNode in xml.DocumentElement) {

            if (xmlNode.Name == "pozycja") {
                if (xmlNode.SelectSingleNode ("kod_waluty").InnerText == currency)
                    return xmlNode.SelectSingleNode ("kurs_sredni").InnerText;      
            }
        }
        return "Nie znaleziono kursu";
    }
  }
}

好吧,我想我找到了。 您当前正在阅读按钮中的文档。 您应该尝试在后台线程中执行此操作。 任务并行库为例:

        XmlDocument dokument = new XmlDocument ();

        Task task = Task.Factory.StartNew(() =>
        {
            try
            {
                dokument.Load("http://nbp.pl/kursy/xml/LastA.xml");
            }
            catch (Exception ex)
            {
                Toast.MakeText(this, "Brak połaczenia z Internetem!", ToastLength.Long);
            }
        });

首先,如果dokument.Load()存在异常,则该异常将通过catch处理程序,并且即使未加载文档,代码也将继续运行。 您可能应该将捕获处理程序更改为:

try
{
    // read xml into string
    var xml = new System.Net.WebClient()
        .DownloadString("http://nbp.pl/kursy/xml/LastA.xml");
    dokument.LoadXml(xml);
}
catch (Exception ex)
{
    Toast
        .MakeText(this, "Brak połaczenia z Internetem! " + ex, ToastLength.Long)
        .Show();
    return;
}

注意,我在MakeText()的末尾添加了.Show() MakeText() 否则,您将看不到实际的Toast。 我还添加了实际的异常。

我觉得您在加载文档时遇到了异常。 确定原因后,其余部分应更容易找出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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