2

Android 開発 (および一般的な初心者向け開発) を始めたときに最初に学んだことの 1 つは、UI はメイン UI スレッド以外の他のスレッドによって更新されるべきではない (多くの場合、更新できない) ということです。

doInBackground() で一連のファイルを移動している AsyncTask があります。ユーザーにそれを表すプログレスバーがあります。

一体(主に怠惰による)私は、doInBackground()メソッド/スレッドでprogressBar.setProgress([更新された進行状況])を試すことにしましたが、驚いたことに、正常に動作します。

しかし、それは私が学んだ慣習に反しているようです。AsyncTask に onProgressUpdate() などがあることは知っていますが、少し混乱しています。現在の実装は問題なく動作しているように見えるため、切り替える価値があるかどうかはわかりません。

このバックグラウンド スレッドでプログレスバーを更新するべきではありませんか?

4

2 に答える 2

3

ProgressBarビューを実際にリフレッシュするときに (スレッドセーフなメソッド) をsetProgress()呼び出すため、クラッシュすることなくこれを行うことができます。refreshProgress()

private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
        if (mUiThreadId == Thread.currentThread().getId()) {
            doRefreshProgress(id, progress, fromUser, true);
        } else {
            if (mRefreshProgressRunnable == null) {
                mRefreshProgressRunnable = new RefreshProgressRunnable();
            }

            final RefreshData rd = RefreshData.obtain(id, progress, fromUser);
            mRefreshData.add(rd);
            if (mAttached && !mRefreshIsPosted) {
                post(mRefreshProgressRunnable);
                mRefreshIsPosted = true;
            }
        }
    }

Runnableメソッド呼び出しが非 UIスレッドで行われた場合は、s を回避して a を UI スレッドにポストしCalledFromWrongThreadExceptionます。

ただし、 UI 関連の呼び出しには常にUI スレッドを使用してください。Android 開発者はいつでも実装を変更でき、ビューは通常スレッドセーフではありません。

于 2013-08-26T21:22:13.987 に答える
1

Android UI ツールキットはスレッド セーフではないため、 を変更しProgressBarたり、そのメソッドを 内から直接呼び出したりしないでください。doInBackground()

代わりに、publishProgress()内部から呼び出すdoInBackground()と、UI スレッドで後続のコールバックを受け取り、好きなようonProgressUpdate()に変更できます。ProgressBar

于 2013-08-26T21:24:13.000 に答える