0

我有一个链接到我的 Android 应用程序的库,我正在从我的 android 活动中调用该库的一些函数,这些函数调用需要时间(4-5 秒)。

由于库的限制,我不能在单独的线程(使用 AsyncTaks、线程)中调用此函数。

当我调用这些函数并且这些函数同时在处理中时,我的 UI 不会响应用户活动并避免我正在显示处理屏幕,并且如果中间用户执行任何关键操作,那么我会收到 ANR 错误。

我怎样才能避免这种 ANR,或者除了将时间处理放在单独的线程中之外,我无法避免它?

谢谢。

4

2 回答 2

0

谁编写了这个库,它是什么?我能想到它为什么会引发异常的唯一原因是它试图从您调用它的线程更新 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();
于 2012-08-17T08:13:38.033 回答
0

最好阅读这篇文章并观看谷歌 IO 视频(比如这个这个)。

如果你没有时间,只需记住这个简单的规则:

长时间操作(如互联网操作、数据库操作、IO 操作以及任何可能只花费 5 秒以上的操作)如果发生在 UI 线程上,可能会导致 ANR。

要更新 UI,您必须使用 UI 线程。如果您需要在长时间操作之后/期间执行此操作,请使用以下类:HandlerAsyncTaskView.postActivity.runOnUiThread

于 2012-08-17T08:04:42.870 回答