【问题标题】:How to avoide android ANR如何避免安卓 ANR
【发布时间】:2012-08-18 21:49:43
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 您确定不能在单独的线程上运行这些调用吗?
  • 如果我从单独的线程调用它,那么我的库就会崩溃。所以我不能从 Thread 中做到这一点。
  • 你在说什么库限制??如果您可以在 UI 线程上执行,您当然可以在单独的线程或异步任务中以相同的方式执行任务。
  • 我同意——除非解决图书馆的基本问题,否则你无法克服这个问题
  • 应用崩溃时会显示什么错误??

标签: android


【解决方案1】:

最好阅读 this 文章并观看 google IO 视频(例如 this 一个和 this 一个)。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 有一个回调,当任务完成时,我需要在本机 (CPP) 层中找到某种方式来触发该时间调用,以便 Android Activity 只会通知 CPP 层 (使用JNI)我们需要调用计时函数,它将返回,CPP层将调用该计时函数,完成后它将使用JNI通知java层。
    • “time take call”是指通话需要很长时间才能完成吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多