我得到了Activity,在onCreate()中我尝试获取数据:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
...............
fillUI();
}
public void getDetailedItem(){
FeedParser parser=new FeedParser();
try{
mItem=parser.parseDetailed();
}catch(Exception e){
closeAndShowError();
}
}
public void fillUI(){
getDetailedItem();
if(mItem!=null){
...............
}else{
closeAndShowError();
}
}
private void closeAndShowError(){
Context context = getApplicationContext();
CharSequence text = getResources().getString(R.string.toast_error);
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
finish();
}
他们的问题是,当Exception发生时,它被捕获,我希望我的活动完成自己,但我仍然得到执行fillUI()的代码,所以我不得不在getDetailedItem()之后放置if语句; 我该如何解决?
答案 0 :(得分:1)
您可以这样做:
public void getDetailedItem(){
FeedParser parser=new FeedParser();
try{
mItem=parser.parseDetailed();
}catch(Exception e){
mItem = null;
}
}
然后在fillUI()
mItem
null
{{1}}显示错误;
答案 1 :(得分:1)
您可以将parseDetailed
中可能引发的异常传递给fillUI
方法:
public void getDetailedItem() throws Exception {
FeedParser parser=new FeedParser();
mItem=parser.parseDetailed();
}
public void fillUI(){
try {
getDetailedItem();
// rest of your code..
} catch(Exception e) {
closeAndShowError();
}
}
答案 2 :(得分:0)
finish()
语句不是立即返回,您的代码会继续运行,直到它确定它已完成。你需要给自己留下一个异常指示器,当它发生时通过你的调用链返回,而不是继续运行。
答案 3 :(得分:0)
因为你正在捕捉异常; fillUI()函数永远不会收到任何错误的通知。
您的codepath如下: fillUI - > getDetailedItem - >异常捕获 - > closeAndShowError - >完成() - >返回closeAndShowError - >捕获块后返回getDetailedItem - >返回fillUI。
基本上,调用fillUI中getDetailedItem之后的代码是因为你捕获了异常并且没有让其他函数知道。无论是通过返回值,还是通过抛出(并且可能捕获)新的异常。
答案 4 :(得分:0)
finish()
会导致Activity
停止作为其生命周期的下一步。但在您称之为它的时候,它仍处于另一个生命周期步骤的过程中:onCreate()
。它不会以某种方式立即退出方法中。
这就是答案,但更好的方法是重新设计一下你的代码。如果你正在处理这样的问题,这可能不是处理它的最干净的方式。