【问题标题】:Problem with AlertDialog (crash when trying to catch exception)AlertDialog 的问题(尝试捕获异常时崩溃)
【发布时间】:2011-05-26 09:07:44
【问题描述】:

我想在我的 XML 无法解析时捕获异常。因为我对正在创建的 XML 没有任何影响,所以我不想在出现问题时捕获异常(比如错误的标签、奇怪的标志等等)。

我创建了以下代码,但它会导致崩溃。我在代码下添加了 LogCat。我不太明白 LogCat 告诉我什么......有人有帮助我的提示吗?谢谢

private void getVacatures(){
    functie = getIntent().getIntExtra("Functie", 0);
    stat =getIntent().getIntExtra("Statuut", 0);
    regio = getIntent().getIntExtra("Straal", 0);
    opl = getIntent().getIntExtra("Opleiding", 0);
    final AlertDialog.Builder builder = new AlertDialog.Builder(JobList.this);

        try {
            Log.e("in try", "try");
            /* Create a URL we want to load some xml-data from. */

            URL url = new URL("C:/Users/hannelore.deblau/Desktop/TESTXML.xml");
            System.out.println("URL: "+ url);

            /* Get a SAXParser from the SAXPArserFactory. */
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();

            /* Get the XMLReader of the SAXParser we created. */
            XMLReader xr = sp.getXMLReader();
            /* Create a new ContentHandler and apply it to the XML-Reader*/ 
            vacatureWebservice vs = new vacatureWebservice();
            xr.setContentHandler(vs);

            /* Parse the xml-data from our URL. */
            xr.parse(new InputSource(url.openStream()));
            /* Parsing has finished. */

            /* Our ExampleHandler now provides the parsed data to us. */
            arrVacatures = vs.getVacatures();
        } catch (Exception e) {
            builder.setTitle(R.string.Fouttitel);
            builder.setMessage(R.string.XMLfout);
            builder.setCancelable(false);
            builder.setPositiveButton(R.string.Ok, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    finish();
                }
            }); 
            builder.create().show();
        }
        //runOnUiThread(returnRes);
}

在 onCreate() 我这样做:

Handler handler = new Handler(); // This code is in the main UI activity class

    handler.post(runnable= new Runnable(){
        public void run(){

            getVacatures();
            runOnUiThread(returnRes);
        }
    });
    Thread thread = new Thread(null, runnable, "MagentoBackground");
    thread.start();

出现错误的 LogCat:http://pastebin.com/X5uk9cex

【问题讨论】:

    标签: android exception dialog crash


    【解决方案1】:

    您正在尝试从名为 MagentoBackground 的工作线程更新 Ui。您需要在主线程中完成您的 UI 工作。尝试使用Handler

    这是Handler的一些教程

    再次在您使用

    之类的网址
      URL url = new URL("C:/Users/hannelore.deblau/Desktop/TESTXML.xml");
    

    这个URL 永远不会调用。您需要做的是将您的xml 保存在Web 服务器中然后访问它。

    编辑了您的 onCreate

         @Override
            protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.your_view);
              runnable= new Runnable() {
                        public void run() {
            // Your code 
    
        try{ /* Create a URL we want to load some xml-data from. */
    
                    URL url = new URL("C:/Users/hannelore.deblau/Desktop/TESTXML.xml");
                    System.out.println("URL: "+ url);
    
                    /* Get a SAXParser from the SAXPArserFactory. */
                    SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();
    
                    /* Get the XMLReader of the SAXParser we created. */
                    XMLReader xr = sp.getXMLReader();
                    /* Create a new ContentHandler and apply it to the XML-Reader*/ 
                    vacatureWebservice vs = new vacatureWebservice();
                    xr.setContentHandler(vs);
    
                    /* Parse the xml-data from our URL. */
                    xr.parse(new InputSource(url.openStream()));
                    /* Parsing has finished. */
    
    
    
                     /* Our ExampleHandler now provides the parsed data to us. */
                        arrVacatures = vs.getVacatures();
              runOnUiThread(returnRes);
    
    
        }
            catch(Exception e)
            {
        //here error comes
        //here also you need to use this code
           runOnUiThread(nullRes);
            }
                            }
                    };
    
    
        Thread thread = new Thread(null, runnable, "MagentoBackground");
        thread.start();
    
    }
    

    现在这是您的异常代码

    private Runnable nullRes= new Runnable() {
            public void run() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(JobList.this);
     builder.setTitle(R.string.Fouttitel);
                builder.setMessage(R.string.XMLfout);
                builder.setCancelable(false);
                builder.setPositiveButton(R.string.Ok, new DialogInterface.OnClickListener() {
    
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish();
                    }
                }); 
                builder.create().show();
    
            }
        };
    

    【讨论】:

    • 对于 URL,我知道,这只是为了测试目的,因为我的原始链接有效。我仍然无法预测是否会出现错误的 XML。这就是为什么我不想抓住它。
    • 添加了onCreate()..可能是关于大括号({})问题的格式。
    【解决方案2】:

    RuntimeException 不是 Exception 的子类,因此您的 catch 子句不会捕获它。您可以更改您的 catch 子句以捕获常见超类 Throwable。这至少可以解决您的代码不处理它的问题。尽管关于异常的原因,可能还有其他问题在起作用。

    由于没有可供对话框使用的处理程序/循环器,因此引发了异常。您需要对话框代码在 UI 线程上运行。

    【讨论】:

    • 但是,如果我调试,它会遍历对话框代码,但不会显示。这也与 Exception 不是 RuntimException 的子类有关吗?将异常更改为 Throwable 会给我同样的崩溃。
    • 实际上再看一遍,我怀疑异常是否会在您的 try 块中引发。问题是对话框代码没有在 UI 线程上运行。
    【解决方案3】:

    我猜你正在使用 AndEngine 或类似的东西,并且这个 sub 是从子线程而不是主要活动调用的。这就是您收到此错误的原因:

    java.lang.RuntimeException: 无法在未调用 Looper.prepare() 的线程内创建处理程序

    尝试在任何线程(可能是 UIThread 或 UpdateThread)之外调用该子。或者,如果您必须在这些线程中调用它,请通过 Main Activity 调用 Handler 并发布它:

    Handler handler = new Handler(); // This code is in the main UI activity class
    

    当你想调用它时:

    handler.post(new Runnable() {
        getVacatures();
    });
    

    【讨论】:

    • 我用这个方法在onCreate中调用了它:runnable= new Runnable(){ public void run(){ getVacatures(); runOnUiThread(returnRes); } };我不知道如何将这两者融合在一起?
    • @Hannelore:这很奇怪!如果您从 onCreate 调用它,我想知道为什么会引发该异常。你试过我写的那个吗?使用处理程序?而且,您从哪一类 onCreate 方法调用?
    • 我已经用处理程序添加了我的 onCreate 代码,它仍然会导致同样的崩溃...我在扩展 ListActivity 的 Activity 中调用 onCreate 方法
    • @Hannelore 那么你是从哪个类调用它的呢?它是从上下文继承的吗?
    • onCreate 在 Activity 类里面,在 onCreate 下面我有一个 ArrayAdapterClass。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-12-05
    • 2014-05-11
    • 2013-09-05
    相关资源
    最近更新 更多