0

Android アプリケーションにリンクされているライブラリが 1 つあります。Android アクティビティからそのライブラリのいくつかの関数を呼び出していますが、それらの関数呼び出しには時間がかかります (4 ~ 5 秒)。

ライブラリの制限により、この関数を別のスレッド (AsyncTaks、Threads を使用) で呼び出すことはできません。

これらの関数を呼び出すと、これらの関数が同時に処理されているときに、UI がユーザー アクティビティに応答せず、処理中の画面が表示されることを回避するために、その間にユーザーがキー アクションを実行すると、ANR エラーが発生します。

この ANR を回避するにはどうすればよいですか、または時間のかかるプロセスを別のスレッドに入れる以外に回避する方法はありませんか?

ありがとう。

4

2 に答える 2

0

この記事をよく読んで、Google IO の動画 (この動画やこちらの動画など) をご覧ください。

時間がない場合は、次の簡単なルールを覚えておいてください。

長い操作 (インターネット操作、DB 操作、IO 操作、および単純に 5 秒以上かかる可能性のある操作など) は、UI スレッドで発生すると ANR を引き起こす可能性があります。

UI を更新するには、UI スレッドを使用する必要があります。長い操作の後/中にそれを行う必要がある場合は、次のようなクラスを使用します: HandlerAsyncTaskView.postActivity.runOnUiThread

于 2012-08-17T08:04:42.870 に答える
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 に答える