使用Toast来处理Fragment类之外的异常

时间:2014-06-01 00:44:54

标签: java android

目前正在创建Android应用。我在Pollen类之上有一个名为Fragment的类,我在这个 second 类中处理异常处理。

这是我的Pollen课程。

public static class Pollen
{

    @SuppressLint("SimpleDateFormat")
    public Pollen(int zipcode, Context context)
    {
                    this.context = context;
        this.zipcode = zipcode;
        Document doc;
        try
        {
            // pass address to 
            doc = Jsoup.connect("http://www.wunderground.com/DisplayPollen.asp?Zipcode=" + this.zipcode).get();

            // get "location" from XML
            Element location = doc.select("div.columns").first();
            this.location = location.text();

            // get "pollen type" from XML
            Element pollenType = doc.select("div.panel h3").first();
            this.pollenType = pollenType.text();

            SimpleDateFormat format = new SimpleDateFormat("EEE MMMM dd, yyyy");

            // add the four items of pollen and dates
            // to its respective list
            for(int i = 0; i < 4; i++)
            {
                Element dates = doc.select("td.text-center.even-four").get(i);
                Element levels = doc.select("td.levels").get(i);

                try
                {
                    pollenMap.put(format.parse(dates.text()), levels.text());
                }
                catch (ParseException e)
                {
                    Toast toast = Toast.makeText(context, R.string.toast_parse_fail, Toast.LENGTH_LONG);
                    toast.show();
                    return;
                }
            }
        }
        catch (IOException e)
        {
            Toast toast = Toast.makeText(context, R.string.toast_parse_fail, Toast.LENGTH_LONG);
            toast.show();
            return;
        }
    }
}

由于Pollen使用网络任务,因此它位于与此问题无关的异步线程下。

每当Pollen遇到异常时,即使Toast,该应用也会崩溃。

我想知道 - 在主类之外的类上处理异常的可接受方法是什么?

1 个答案:

答案 0 :(得分:1)

您的应用程序崩溃了,因为您正在从UI线程中创建一个Toast。

您无法从未在主线程(UI线程)上运行的类创建Toast。但是你可以使用runOnUiThread(http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable))在你的Pollen类的UI线程上执行代码。

YourActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    Toast toast = Toast.makeText(YourActivity.this, R.string.toast_parse_fail, Toast.LENGTH_LONG);
        toast.show();
                }
            });

要使其工作,您必须将Activity的上下文传递给自定义类并使用上面的方法,或者您可以抛出异常并从活动中捕获它并在那里处理它。