从Android中的服务更新UI

时间:2015-10-01 09:57:17

标签: android

我有一个可以监控房间噪音水平的应用程序,我最初从Github获得了代码,在原始代码中,程序员正在监控主要活动的噪音水平并在textview中显示结果,但我想要监控使用服务,我已经实现了一切和它的工作,但文本视图似乎滞后,让我说我做了一点噪音,噪音水平达到5,即使在房间没有噪音,它仍然坚持5,但在最初的应用程序中,它是如此敏感,它会回到0或另一个值取决于噪音水平,我不知道我哪里出错,但下面是我的代码:

主要活动

public class StartingPoint extends Activity {

private String volumeBars;
private String volumeLevel;
private TextView volumeBarView;
private TextView volumeLevelView;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Toast.makeText(getBaseContext(), "Loading...", Toast.LENGTH_LONG).show();
    setContentView(R.layout.activity_starting_point);


    //starting Service
    startService(new Intent(this, VolumeListerner.class));
    volumeBarView = (TextView) findViewById(R.id.volumeBars);
    volumeLevelView = (TextView) findViewById(R.id.volumeLevel);



}



@Override
public void onResume() {
    LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter("UI_UPDATER"));
    super.onResume();
    // Sound based code

}

@Override
public void onPause() {
    super.onPause();




}



public void updateTextView() {

    volumeBarView.setText(volumeBars);
    volumeLevelView.setText(volumeLevel);
    return;
}


private BroadcastReceiver mReceiver = new BroadcastReceiver() {




    @Override
    public void onReceive(Context context, Intent intent) {
        volumeBars = intent.getStringExtra("VolumeBars");
        volumeLevel = intent.getStringExtra("volumeLevel");
        Log.d("receiver", "Got message: " + volumeBars + " : " + volumeLevel);
        updateTextView();


    }
};

服务:

public class VolumeListerner extends Service {

private static String volumeVisual = "";
private static  int volumeToSend;
private Handler handler;
private SoundMeter mSensor;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** The service is starting, due to a call to startService() */

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    soundLevelCheck();
    return super.onStartCommand(intent, flags, startId);
}


private void soundLevelCheck()
{
    mSensor = new SoundMeter();
    try {
        mSensor.start();
        Toast.makeText(getBaseContext(), "Sound sensor initiated.", Toast.LENGTH_SHORT).show();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    handler = new Handler();

    final Runnable r = new Runnable() {

        public void run() {

            // Get the volume from 0 to 255 in 'int'
            double volume = 10 * mSensor.getTheAmplitude() / 32768;
            volumeToSend = (int) volume;
            volumeVisual = "";

            for( int i=0; i<volumeToSend; i++){
                volumeVisual += "|";
                updateUI();
            }
            handler.postDelayed(this, 250); // amount of delay between every cycle of volume level detection + sending the data  out
        }
    };

    // Is this line necessary? --- YES IT IS, or else the loop never runs
    // this tells Java to run "r"
    handler.postDelayed(r, 250);
}



private void updateUI()
{


    Intent intent = new Intent( "UI_UPDATER" );
    intent.putExtra("VolumeBars", "Volume Bars: " +  String.valueOf(volumeVisual));
    intent.putExtra("volumeLevel","Volume Levels: " +  String.valueOf(volumeToSend));
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

}

1 个答案:

答案 0 :(得分:0)

我建议您使用增强型事件总线,重点放在Android支持上。你可以选择:

1- Otto

2- Event Bus