0

クラスが ContentObserver を拡張する Android アプリを開発しています。VOLUME_RING の変更を監視するためにクラスを登録しています。

私のクラスの onchange メソッドは、音量ボタンの変更時にのみ呼び出されます。

問題は、クラスのコンストラクターで更新されるグローバル int 変数が onchange メソッドで更新されないことです。

以下のコードは私が試したものです、

   public class VolumeChecker extends ContentObserver 
    {
         Context context;
         Handler handler;

         int initialVolume;


public VolumeChecker(Context c, Handler handler)
{
    super(handler);
    context=c;
    this.handler = handler;

    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    initialVolume = audio.getStreamVolume(AudioManager.STREAM_RING);

    Log.e("inisde","volvhevker - intitvol " + initialVolume);

}

@Override
public boolean deliverSelfNotifications()
{
    return super.deliverSelfNotifications();
}

@Override
public void onChange(boolean selfChange) 
{

    super.onChange(selfChange);

    Log.e("onchange","initialVolume" + initialVolume);
    refresh();
}


public void refresh()
{
    new VolumeChecker(context,handler);
}

}

更新時にコンストラクターで更新される initialVolume 変数の値が、onchange メソッドに反映されません。

助けてください。ありがとう!

4

1 に答える 1

1

VolumeChecker内に新しいものを作成する目的は何refresh()ですか? 次のように変数を再度更新するだけです。

public void refresh() {
    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    initialVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
}

おそらく、オーディオをグローバル変数にするリファクタリングを行って、毎回再作成する必要がないようにすることもできます。refresh()メソッドの内容をメソッドに直接リファクタリングすることもできonChange()ます。

于 2013-07-03T14:35:36.277 に答える