我有一个链接到我的Android应用程序的库,我正在从我的android活动中调用该库的一些函数,这些函数调用非常耗时(4-5秒)。
由于库的限制,我不能在单独的线程中调用这个函数(使用AsyncTaks,thread )。
当我调用这些函数时,当这些函数同时进行时,我的UI不响应用户活动,以避免显示处理屏幕,如果中间用户执行任何关键操作,则会出现ANR错误。
我如何避免这个ANR,或者我没有办法避免它,除了把耗时的进程放在单独的线程中?
谢谢。
发布于 2012-08-17 16:04:43
最好阅读文章和观看谷歌IO视频(比如 one和 one)。
如果你没有时间做这个,只需记住这条简单的规则:
长操作(如互联网操作、数据库操作、IO操作以及任何耗时超过5秒的操作)如果发生在UI线程上,可能会导致ANR值。
要更新UI,必须使用UI线程。如果您需要在长操作之后/期间执行此操作,请使用以下类:Handler、AsyncTask、View.post、Activity.runOnUiThread。
发布于 2012-08-17 16:13:38
这个库是谁写的?它是什么?我能想到的唯一原因是它会抛出异常,因为它试图从你调用它的线程中更新UI。如果库方法需要4-5秒来竞争,那么它们应该为您提供一个回调机制,以便您可以在UI线程上更新您的UI。
new Thread("Slow native process") {
public void run() {
// call your "time taking process", passing in the callback (you could implement in the outer class and pass "this"...)
callNativeMethod( args, new YourCallbackInterface() {
public void onResult( String response ) {
activity.runOnUiThread( new Runnable() {
// update UI
});
}
});
}
}.start();https://stackoverflow.com/questions/12001933
复制相似问题