ash*_*gpu 5 java android android-ndk android-activity
创建后,我的应用程序会加载各种共享对象。我想捕获由于共享对象不存在于设备而引发的错误,并向用户显示更好的错误消息。我该如何实现?
我可以抓住java.lang.UnsatisfiedLinkError
这样的
static
{
try
{
System.loadLibrary("MyApplication");
}
catch(java.lang.UnsatisfiedLinkError e)
{
if(e.getMessage().contains("libSharedObject"))
{
Log.e( TAG, "This device does not support ..." );
}
else
{
throw e;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,Toast.makeText(...).show()
以及其他应用程序消息框将不起作用,因为该应用程序将onCreate()
由于先前的错误而死亡。
是否可以更改系统默认错误消息“不幸的是有一个错误..”的方法?还是通过其他进程或Android OS显示错误消息的方式?
我用这个答案找到了答案。我在该static {}
块中捕获了异常,设置了一个有错误和消息的成员变量,然后创建了一个新线程,该线程使用Toast显示错误并使用Looper在该线程中调用消息循环。在让应用程序崩溃之前,我需要休眠主线程一段时间。
static boolean mWasError = false;
static String mErrorMessage = "";
static
{
try
{
System.loadLibrary("MyApplication");
}
catch(java.lang.UnsatisfiedLinkError e)
{
if(e.getMessage().contains("libOpenCL"))
{
Log.e( TAG, "This device does not support OpenCL" );
mWasError = true;
mErrorMessage = "This device does not support OpenCL";
}
else
{
throw e;
}
}
}
@Override
protected void onCreate( Bundle savedInstanceState )
{
if(mWasError)
{
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(getApplicationContext(), mErrorMessage, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}.start();
try
{
Thread.sleep(10000);
}
catch(InterruptedException e)
{
}
}
// Will crash here if there was an error
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3629 次 |
最近记录: |