0

遅延実行可能オブジェクトをハンドラーに渡す関数にオブジェクトが渡されました。

オブジェクトが渡されたとき、およびロックオブジェクトを使用して変更されたときにオブジェクトをロックできますが、オブジェクトは「エイリアン」メソッドのアップロードに渡される必要があります。

このエイリアンメソッドのアップロードがオブジェクトのスレッドセーフを壊さないようにするにはどうすればよいですか?

この遅延スレッドだけでなく他の場所から渡されたオブジェクトがあるため、オブジェクトロックは無効であり、非常に多くの機能が含まれているため、呼び出し全体をロックオブジェクトでロックする必要があります。

private ContentValues mEvent;
protected final Object mEventLock = new Object();

public void delayFunction(final Values e) {

    // Sanity check
    if (e == null) {
        return;
    }

    synchronized (mEventLock) {
        mEvent = e;
    }

    this.handler.postDelayed(new Runnable() {

        @Override
        public void run() {

            if (prefs != null) {
                final String refs = prefs.getPrefs();
                if (refs != null && refs != "") {

                    log.d("refs field: '%s'", refs);

                    synchronized (mEventLock) {
                        mEvent.remove(refs);
                        mEvent.put(refs, 1);
                    }
                }
            }

            synchronized (mEventLock) {
                // Upload event.
                upload(mEvent);
            }

        }
    }, INSTALL_DELAY);
}
4

1 に答える 1

0

あなたがあなたのコードで何を達成しようとしているのか理解できません:

  • delayFunctionに割り当てることeから始まりますmEvent
  • 次に、mEventsを変更します
  • 次に、mEventsをアップロードします

e同期せずに、単にローカルコピーを作成して、そのコピーで作業してみませんか?

また、同期ブロックを終了するため、ランナブル実行とのmEvent間の別のスレッドによって変更される可能性があります。ランナブルは別のスレッドで動作し、アップロードを見逃してしまいます。mEvent = ee

しかし、それは意図的なものかもしれません。

于 2012-05-09T17:47:21.400 に答える