正如标题所示,我正在尝试创建一个将在android中显示错误消息的类,我的理由是,不是在需要的地方创建弹出窗口,而是在声明预设错误字符串MainActivity,创建一个包含预设信息和实际显示消息所需代码的单独类会更清晰。它需要的唯一参数是实际异常。
我尝试实现此目的的方法是通过扩展AlertDialog.Builder类,如下所示:
public class showError extends AlertDialog.Builder
{
private enum exString
{
UnknownHostException, IOException,
ConnectException, Exception,
NoTimeTablesFoundException
}
private String UHE;
private String IOE;
private String CE;
private String NTTFE;
private String CNFE;
private String title;
private String E;
private String message ="";
private String exception="";
Context cxt;
exString enumExc;
public showError(Exception ex, Context cxt)
{
super(cxt);
this.cxt = cxt;
initString();
try
{
exception = ex.getClass().getName().toString();
exception = exception.substring(exception.lastIndexOf(".")+1);
enumExc = exString.valueOf(exception);
}
catch (IllegalArgumentException err)
{
enumExc = exString.valueOf("Exception");
}
setType();
setTitle(title);
setMessage(message);
setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
}
});
setIcon(android.R.drawable.ic_dialog_alert);
//show();
}
private void initString()
{
String UHE = cxt.getString(R.string.errorUHE);
String IOE = cxt.getString(R.string.errorIOE);
String CE = cxt.getString(R.string.errorCE);
String NTTFE = cxt.getString(R.string.errorNTTFE);
String title = cxt.getString(R.string.errorTitle);
String E = cxt.getString(R.string.errorUnknown);
}
private void setType()
{
switch (enumExc)
{
case UnknownHostException:
{ message = UHE; break; }
case IOException:
{ message = IOE; break; }
case ConnectException:
{ message = CE; break; }
case NoTimeTablesFoundException:
{ message = NTTFE; break; }
case Exception:
{ message = E + exception; break; }
}
}
}
我希望这项工作的方式是:
new showError(whateverException, this);
然而,由于某些原因我不明白,它经常给出一个WindowLeaked异常? 我在类中注释了show()命令,而是开始使用
new showError(whateverException, this).show();
这似乎有时会起作用,但这也会不时抛出WindowLeaked异常。
首先,有人可以解释为什么,因为它是相同的上下文,它在我调用show命令(在类本身的构造函数中,或通过调用.show)时会有所不同吗? ) 方法)? 为什么在构造函数中调用show总是抛出异常,而使用实例化类的.show()调用它有时会起作用?
我理解在创建对话框的活动在对话框关闭之前结束时会抛出此异常。它是否正确? 如果是,当我尝试使用MainActivity作为上下文时,我是否应该相信MainActivity结束?如何在应用程序仍在运行时结束?
另外,如果这些对话框是异步的(它们位于UI线程的单独线程上,以便不阻止UI线程,我的理解是否正确?)为什么它们需要在活动结束前被解雇? 因为,为了让我的代码能够正常工作,我实际上需要让应用程序等待对话框被解除(在显示MessageBox时你不能使用Windows桌面应用程序的主要形式) ,但我的理解是android并没有按设计做到这一点。
更令人困惑的是,如果不是使用这种方法,我会在每个catch块中创建并显示AlertDialog.Builder,这似乎每次都能完美运行......为什么?
其次,我并没有完全试图找出如何解决我设计的缺陷,但实际上我正在寻找的是理解为什么我的设计存在缺陷以及采用什么方法来实现我想要的?
或者更好的是,处理异常并向用户显示相应错误消息的行业标准是什么,以便他知道出了什么问题(如果可能的话)?
感谢您的时间,并原谅冗长的阅读。