Проблема с AlertDialog (сбой при попытке отловить исключение) - PullRequest
0 голосов
/ 26 мая 2011

Я хочу поймать исключение, когда мой 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

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Вы пытаетесь обновить пользовательский интерфейс из рабочего потока с именем MagentoBackground.Вы должны выполнять работу с пользовательским интерфейсом из основного потока.Попробуйте использовать Handler.

Вот учебник для Handler

Опять-таки вы используете URL-адрес, подобный

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

Этот URL никогда не будет вызываться. Что вам нужно сделать, это сохранить ваш XML на веб-серверезатем получите к нему доступ.

Отредактировано Ваше 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();

        }
    };
0 голосов
/ 26 мая 2011

Полагаю, вы используете AndEngine или что-то в этом роде, и эта подпрограмма вызывается из подпотока, а не из основного действия. Вот почему вы получаете эту ошибку:

java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare ()

Попробуйте вызвать этот саб за пределами какого-либо потока (может быть, UIThread или UpdateThread). Или, если вы ДОЛЖНЫ вызывать его в этой теме, вызовите обработчик по основному виду деятельности и опубликуйте его:

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

И когда вы хотите позвонить:

handler.post(new Runnable() {
    getVacatures();
});
0 голосов
/ 26 мая 2011

RuntimeException не является подклассом Exception, поэтому ваше предложение catch не будет его перехватывать. Вы можете изменить свое предложение catch, чтобы перехватить Throwable, который является общим суперклассом. Это, по крайней мере, решило бы проблему вашего кода, не обрабатывая его. Возможно, есть и другие проблемы, связанные с причиной исключения.

Исключение выдается, потому что в диалоге нет обработчика / зацикливателя. Вам нужен код диалога для запуска в потоке пользовательского интерфейса.

...