目前正在创建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
,该应用也会崩溃。
我想知道 - 在主类之外的类上处理异常的可接受方法是什么?
答案 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的上下文传递给自定义类并使用上面的方法,或者您可以抛出异常并从活动中捕获它并在那里处理它。