我的应用程序是一个混合 html5 + JS + android,它在 webview 中运行并通过 JS 接口与 Andorid 进行如此多的通信。
我收到一些报告说它在某些设备上 2 秒后失败。我添加了 ACRA,所以我可以得到报告,但我没有得到任何东西。
所以我尝试自己测试它,为了引发异常,我添加了一个代码来操作 Javascript 界面函数中的主线程视图,该函数由 html 中的按钮触发。这引发了一个例外:只有创建视图层次结构的原始线程才能接触其视图。现在应用程序启动,当我点击按钮时,它异常退出,ACRA 发送报告。
然后我把操作代码放在一个 JS 接口的函数中,该函数在应用程序启动后立即被调用。现在应用程序在一秒钟后关闭。但 ACRA 不会发送任何错误。即使是 ExceptionHandler 也没有抓住它,而是抓住了第一种情况。
这是第二种情况的日志:
59): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@43f8d990 (uid=10019 pid=329)
12-15 01:18:07.047: WARN/dalvikvm(409): JNI WARNING: JNI method called with exception raised
12-15 01:18:07.047: WARN/dalvikvm(409): in Landroid/webkit/BrowserFrame;.stringByEvaluatingJavaScriptFromString (Ljava/lang/String;)Ljava/lang/String; (NewString)
12-15 01:18:07.057: WARN/dalvikvm(409): Pending exception is:
12-15 01:18:07.057: INFO/dalvikvm(409): Landroid/view/ViewRoot$CalledFromWrongThreadException;: Only the original thread that created a view hierarchy can touch its views
我不知道这个待处理的异常是什么?我在网上找不到任何东西。我想知道为什么 ACRA 或异常处理程序不捕获它?
class JavaScriptInterface
{
MyActivity parent;
JavaScriptInterface(MyActivity parent)
{
this.parent = parent;
}
public void immediatelyCalled()
// Webview load index.html in oncreate of activity and js inside html calls this function immediately
{
parent.textview1.setText("test");
// raise an exception which ACRA or Exception Handler dont catch
// Problem is here
}
public void buttonCalled()
// This is called when a button is tapped in html
{
parent.textview1.setText("test");
// raise an exception which Exception Handler and ACRA catch
}
}
这是我的活动:
public class MyActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
class MyExceptionHandler implements Thread.UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread thread, Throwable throwable)
{
Log.d("ExceptionHandler", "Caught exception: " + throwable.getClass().getName() + ": " + throwable.getMessage());
}
}
MyExceptionHandler handler = new MyExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);
this.wv = (WebView) findViewById(R.id.webview);
this.wv.addJavascriptInterface(new JavaScriptInterface(this), "android");
this.ws = this.wv.getSettings();
this.ws.setJavaScriptEnabled(true);
this.wv.loadUrl("file:///android_asset/index.html");
}
}
这是 index.html 的一部分:
<script type="text/javascript">
android.immediatelyCalled();
</scritp>
<button onclick="android.buttonCalled()"></button>
在 AVD 2.2 和 Xperai Arc 4.0.3 上测试,两者相同